【问题标题】:Running a script in terminal using Linux使用 Linux 在终端中运行脚本
【发布时间】:2015-11-16 17:39:48
【问题描述】:

我试图在终端中运行此脚本,但它不工作,并说权限被拒绝。 scriptEmail 是文件名。

% find . -type d -exec ./scriptEmail {} \;

scriptEmail的写法如下:

# !/bin/bash
# Mail Script
find gang-l -type f -name "*" -exec sh -c ' file = "$0" java RemoveHeaders "$file" > processed/$file ' {} ';'

我的读写权限

-rwxr-xr-x

【问题讨论】:

  • 你从中得到了什么错误?
  • 权限被拒绝
  • 它实际上是一个可执行文件吗?例如,你能成功运行./scriptEmail . 吗? ls -l 是否显示它具有可执行权限?它有有效的 shebang 吗?
  • 顺便说一下,如果您不想让find 尝试针对. 运行它,而只针对子目录,您将需要使用-mindepth 1
  • @ryhan112, # ! 错误;它必须是#!,没有空格。

标签: linux shell unix


【解决方案1】:

关于权限:

  • 检查您的 shebang 是否位于文件的最顶部,并且它以#! 开头准确# ! 不起作用
  • 检查您的文件是否被授予执行权限; chmod 750 scriptEmail 可以。
  • 检查您的文件是否使用了 UNIX 换行符 - 对于 DOS 换行符,您的 shebang 可能有一个隐藏字符,使其指向实际上不存在的解释器。
  • 检查存储文件的目录是否位于允许执行脚本的目录中(未使用noexec 标志挂载,或在不允许执行的 SELinux 上下文中)。

如果您的挂载点是 noexec,或者您创建可执行脚本的能力被 SELinux 或类似软件阻止,请使用 find . -type d -exec bash ./scriptEmail {} \; 明确指定解释器,而不是尝试执行您的脚本。


第二:由于您已经在使用find 执行脚本——并使用它在目录中递归——你不需要在里面第二个find(这可能会让你在processed/dirA/dirB/file 上运行)以及processed/dirB/fileprocessed/file——在目录不存在的地方都有错误)。

#!/bin/sh
cd "$1" || exit             # if we can't cd to directory given in argument, exit.
mkdir -p processed || exit  # if we can't create our output directory, exit.
for f in *; do              # ...iterate through all directory contents...
  [ -f "$f" ] || continue   # ...if they aren't files, skip them...
  java RemoveHeaders "$f" >processed/"$f" # run the processing for one item
done

【讨论】:

  • 我已经运行了你的格式化脚本,但我仍然被拒绝
  • 你检查过清单了吗?我给了你四颗子弹;它们都很重要。
  • (如果您的系统管理员不希望主目录的内容可执行,他们可以这样做,但您无能为力;我还添加了有关解决方法的注释)。跨度>
  • chmod 750 scriptEmail 现在可以了,所以我应该再次运行代码并检查它是否运行脚本?
  • 如果你正在处理的是一个noexec 挂载标志,那么 chmod 将无济于事——你将拥有 inode 的权限,但它仍然会拒绝执行。如果所有错误都是单个文件权限,那么您可能会很高兴。无论如何——是的,绝对是,测试!为什么你需要我的许可才能进行实验? :)
【解决方案2】:

试试

sudo find . -type d -exec ./scriptEmail {} \;

【讨论】:

  • 我正在使用大学服务器访问文件,因此该文件不是 'sudoable'
  • @ryhan112, ...即使您确实有权使用sudo,它仍然更有可能破坏事物(即通过创建您的普通用户无法写入的文件) 而不是在这种情况下正确修复它们而不会产生副作用。
猜你喜欢
  • 1970-01-01
  • 2018-05-04
  • 2023-03-30
  • 2018-10-10
  • 2016-07-23
  • 2020-05-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多