Unix-如何在一个目录中生成多个shell脚本?

Unix-如何在一个目录中生成多个shell脚本?,unix,shell,Unix,Shell,当我想在Unix中执行一些shell脚本时(假设我在脚本所在的目录中),我只需键入: ./someShellScript.sh 当我想“source”它(例如,在当前shell中运行它,而不是在新shell中运行它)时,我只需在它前面键入相同的命令“(或等效的“source”命令): . ./someShellScript.sh 现在是棘手的部分。当我想在当前目录中执行“多个”shell脚本(比如所有后缀为.sh的文件)时,我键入: find . -type f -name *.sh -e

当我想在Unix中执行一些shell脚本时(假设我在脚本所在的目录中),我只需键入:

./someShellScript.sh
当我想“source”它(例如,在当前shell中运行它,而不是在新shell中运行它)时,我只需在它前面键入相同的命令(或等效的“source”命令):

. ./someShellScript.sh

现在是棘手的部分。当我想在当前目录中执行“多个”shell脚本(比如所有后缀为.sh的文件)时,我键入:

find . -type f -name *.sh -exec {} \;
但是“我应该使用什么命令来“源”目录中的多个shell脚本”
到目前为止,我已经试过了,但没有成功:

find . -type f -name *.sh -exec . {} \;
它只抛出了这个错误:

find: `.': Permission denied


谢谢。

请尝试以下版本的Jonathan代码:

export IFSbak = $IFS;export IFS="\0"
for file in `find . -type f -name '*.sh' -print0`
do source "$file"
end
export IFS=$IFSbak
问题在于shell的工作方式,而“.”本身不是一个命令(这里的源代码也不是)。当您运行find时,shell将自身分叉,然后转入find进程,这意味着任何环境变量或其他环境内容都会进入find进程(或者更可能的是,为每个exec的新进程自行分叉)


另外,请注意,如果文件名中有空格,则您的命令(和Jonathan的)将不起作用。

您可以使用
find
xargs
执行此操作:

find . -type f -name "*.sh" | xargs -I sh {}

使用find是不必要的,因为他是在当前目录中进行查找的。还要注意文件名中的空格。谢谢。但我在当前目录中也有一些“以“.sh”结尾的目录”。脚本将尝试运行所有的文件,但也“所有的目录”,不是吗?是否仅对文件有任何限制?是的,正如所写,它将尝试运行名称以“.sh”结尾的目录。问题:到底是什么让你给一个目录加后缀“.sh”?(如果您在问题中注意到后缀为“.sh”的文件和目录混合在一起,那么正如Ephemient所给出的那样,准确的答案可以提前给出。)如果文件名可能包含空格或其他不太理想的字符,那么请使用
do。改为“$file”
。全球扩张是安全的。此外,如果当前目录未包含在“$PATH”(许多人建议使用该目录;该建议有一些优点),那么您应该使用
do。“/$file”
。当然可以。“查找”运行命令,而不是shell。它显然试图执行当前目录,
,这有点徒劳:-)
find . -type f -name "*.sh" | xargs -I sh {}