我想同时运行一个目录中的所有脚本。
我知道我可以获取所有脚本的列表,并使用“ls ./*.sh”执行目录中的第一个脚本,但我似乎无法运行所有脚本。
我还尝试了大括号扩展 {./*.sh;但这也只运行了第一个脚本。
在弄清楚如何运行所有这些之后,我想在后台运行所有它们。
我知道我可能可以使用 for 循环来完成此操作,但我希望有一个简单的使用通配符或大括号扩展的简单衬里可以简单地完成工作。
我怎样才能做到这一点?
答案1
for script in ./*.sh; do "$script" & done
wait
或者使用 GNU 来限制并发调用的数量xargs
:
xargs -n1 -P5 -r0a <(printf '%s\0' ./*.sh) env
(请注意,它假设脚本名称不包含=
字符)。
或者与zsh
:
autoload zargs # best in ~/.zshrc
zargs -n1 -P5 ./*.sh -- command
(这里一次最多 5 个)。
请注意,如果这些脚本产生任何输出,它们最终可能会严重交错。 GNUparallel
通过将每个命令的输出存储在一个单独的临时文件中并按顺序输出来解决这个问题:
parallel -j0 exec ::: ./*.sh
(-j0
要并行运行所有这些,请删除对 CPU 核心数量的限制,或自行指定数量)。
答案2
您可以通过将文件夹传递给命令来执行文件夹中的所有脚本run-parts
:
run-parts /path/to/folder &
答案3
在后台运行每个 shell 脚本。
sh -x script1.sh & sh -x script2.sh & sh -x script3.sh &
在后台模式下运行每个脚本,以便运行下一个命令而无需等待当前命令完成。
'&' 使脚本在后台运行,以便提示不会等待它完成
答案4
在后台运行脚本:
./myscript.sh & ./myscript2.sh & ....