2009-12-26 43 views
3

当我想以执行的Unix 一些shell脚本(让我们说我在剧本的目录),我只需要输入:Unix - 如何在一个目录中获取多个shell脚本?

./someShellScript.sh 

,当我想“源”(例如在当前shell中运行它,而不是在新shell中),我只是用“”键入相同的命令。(或与 “源极” 命令当量)收到:

. ./someShellScript.sh 


而现在的棘手的部分。当我想执行“多” shell脚本(假设所有.sh后缀的文件)在当前目录中,I型:

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

“我应该用什么命令” SOURCE“目录中的多个shell脚本”
我想这到目前为止,但它没有工作:

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

,它只是抛出这个错误:

find: `.': Permission denied 


感谢。

+0

当然。查找运行命令,而不是一个shell。它显然试图执行当前目录,'',这有点无用:-) – Jens 2012-05-30 22:47:36

回答

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

谢谢。但是我在当前目录中也有一些“目录结尾为”.sh“”。脚本会尝试运行所有的文件,但也“所有的目录”,不是吗?对文件没有任何限制吗? – Petike 2009-12-27 00:48:09

+3

'[-f $ file] &&。 $ file' – ephemient 2009-12-27 00:51:42

+0

谢谢。我很傻:-)。 – Petike 2009-12-27 00:57:47

0

尝试的乔纳森以下代码版本:

export IFSbak = $IFS;export IFS="\0" 
for file in `find . -type f -name '*.sh' -print0` 
do source "$file" 
end 
export IFS=$IFSbak 

问题在于外壳的工作方式,而“”本身不是一个命令(既不是源代码)。当你运行find时,shell会自行分叉,然后进入查找过程,这意味着任何环境变量或其他环境变量都会进入查找过程(或者更有可能找到为每个exec执行新进程的脚本)。

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

+0

使用find是不必要的,因为他在当前目录中执行它。还必须注意文件名中的空格。 – ghostdog74 2009-12-27 00:18:19

0

您可以使用findxargs做到这一点:

find . -type f -name "*.sh" | xargs -I sh {} 
相关问题