我有一系列小型 bash 脚本,需要按特定顺序运行。
我认为我可以通过创建一个接一个地执行每个脚本的脚本来实现这一点,因为大多数脚本都从前一个脚本的输出文件中获取输入。
但是,当我尝试执行脚本时,它会尝试一次运行每个内部脚本,并返回很多no such file or directory
错误。
我的脚本格式如下。
#!/bin/bash
bash script1.sh
bash script2.sh
bash script3.sh
我不想在 script1.sh 执行完成之前运行 script2.sh。有没有简单的方法可以做到这一点?
编辑:我忘了说列表中还有一些 Python 脚本。不确定这是否会改变什么。
答案1
适合您的正确解决方案取决于您的需求:
- 结合脚本
&&
将仅在第一个脚本执行时执行第二个脚本成功退出 - 结合脚本
||
将仅在第一个脚本执行时执行第二个脚本未成功退出
如果你希望第二个命令在第一个命令之后执行不管无论它是否成功退出,您都可以使用两者;
任一& wait
:
bash script1.sh ;
bash script2.sh & wait
bash script3.sh
答案2
您可以尝试获取脚本
#!/bin/bash
. script1.sh
. script2.sh
. script3.sh
如果每个脚本之后必须删除变量,请将其括在括号中,即
#!/bin/bash
(
. script1.sh
)
(
. script2.sh
)
(
. script3.sh
)
另一种可能性是直接调用脚本:
#!/bin/bash
./script1.sh
./script2.sh
./script3.sh
如果您希望脚本生成的所有后台进程完成,请添加
wait
等待它们
例如。
./script1.sh
wait
./script2.sh
您当前的解决方案正在同时运行,并bash
打开一个新 shell 并执行该解决方案
答案3
照这样去做。
bash script1.sh && bash script2.sh && bash script3.sh
或者这样:
bash script1.sh &&
bash script2.sh &&
bash script3.sh
这将确保如果前一个脚本成功退出,那么下一个脚本将执行。
或者使用;
是否需要执行下一个脚本,除了前一个脚本退出成功或失败之外。
bash script1.sh ; bash script2.sh ; bash script3.sh
答案4
添加set -e
到所有脚本的开头。启用此选项后,任何命令失败都会导致整个脚本失败,就像命令被“&&”分隔时发生的情况一样。规格
“大多数脚本都从前一个的输出文件中获取输入”听起来很像make
。考虑使用它。