Unix - 如何在一个目录中调用多个shell脚本?

3
当我想要在Unix中执行一些shell脚本(假设我在脚本所在的目录中),我只需要输入以下命令:
./someShellScript.sh

当我想要“源”(例如,在当前shell中运行它,而不是在新shell中)时,我只需在相同的命令前面加上"."(或等效的"source"命令):

. ./someShellScript.sh


现在是比较棘手的部分。当我想要执行"多个" shell 脚本(假设所有后缀名为 .sh 的文件)在当前目录中,我输入以下命令:

find . -type f -name *.sh -exec {} \;

但是,我应该使用什么命令来在目录中“SOURCE”多个shell脚本呢?
到目前为止,我尝试了以下方法,但都没有成功:

find . -type f -name *.sh -exec . {} \;

但它只抛出了这个错误:

find: `.': Permission denied


Thanks.


当然。Find 命令并不是一个 shell,它似乎试图执行当前目录“.”,这有点徒劳无功 :-) - Jens
3个回答

13
for file in *.sh
do . $file
done

谢谢。但是我在当前目录中还有一些以“.sh”结尾的目录。脚本将尝试运行所有文件,但也会运行“所有目录”,不是吗?难道没有仅限于文件的限制吗? - Petike
是的,按照写法,它会尝试运行以“.sh”结尾的目录。问题是:你到底为什么给一个目录加上“.sh”后缀?(如果你在问题中观察到有一些文件和目录都带有“.sh”后缀,那么像Ephemient所提供的准确答案本来就可以直接给出了。) - Jonathan Leffler
如果文件名可能包含空格或其他不太理想的字符,则应改用 do . "$file"。全局扩展是安全的。此外,如果当前目录未包含在“$PATH”中(许多人建议这样做;建议有一些优点),则应使用 do . "./$file" - Jonathan Leffler

0
尝试使用以下版本的Jonathan代码:
export IFSbak = $IFS;export IFS="\0"
for file in `find . -type f -name '*.sh' -print0`
do source "$file"
end
export IFS=$IFSbak

问题在于shell的工作方式,'.'本身不是一个命令(source也不是)。当你运行find时,shell会分叉并转换为find进程,这意味着任何环境变量或其他环境信息都会进入find进程(或者更可能的是,find会为每个exec分叉出新的进程)。
此外,请注意,如果文件名中有空格,则您的命令(以及Jonathan的命令)将无法正常工作。

使用查找是不必要的,因为他正在当前目录中进行。还需要注意文件名中的空格。 - ghostdog74

0
你可以使用 findxargs 来完成这个任务:
find . -type f -name "*.sh" | xargs -I sh {}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接