我有一个bash脚本运行一个主要用C和Python编写的小程序列表,因为程序本身不是没有错误的,它们可能会崩溃或遇到无限循环,所以在BASH脚本中,我运行程序在子shell中,它不会打破主壳,这就是它的喜好:
#!/usr/bin/env bash
set -e
for py_p in "${py_program_list[@]}"; do
(python "$py_p") || echo "terminated!"
done
for c_p in "${c_program_list[@]}"; do
("$c_p") || echo "terminated!"
done
问题是,当在python程序中循环时,bash脚本不会受到python程序中任何错误的影响,这是我的预期。但是,如果任何C程序退出并出错,则bash脚本会立即退出。
更新:
我在OSX 10.9.5中使用BASH 3.2
更新2:
更新了问题以使其更加清晰,抱歉造成混淆。我遇到的问题是关于C程序,python部分确认子shell中的错误不会影响主shell但C程序会破坏规则。
答案 0 :(得分:0)
一切都取决于Python程序的退出状态。也许他们返回相同的值,无论他们的执行成功与否。所以...基本上,你不能依赖他们的退出状态。
答案 1 :(得分:0)
Python脚本很好,无论我使用Ctrl + C还是崩溃 由于某种原因,他们不会阻止主炮弹的运行 我的期望。但是C程序没有,在C时键入Ctrl + C. 程序正在运行将退出bash脚本。
Python处理中断信号本身(输出Traceback
... KeyboardInterrupt
)然后正常终止,将退出状态 1 返回到bash
。
您的C程序显然没有处理信号,因此采取默认操作来终止该过程; bash
被告知该程序已被信号 SIGINT 终止
现在bash
的行为会有所不同,具体取决于子程序终止的类型(正常或发信号):在第一种情况下,它继续执行|| echo "terminated!"
,在第二种情况下,它会自行终止,正如你所观察到的那样
您可以通过捕获脚本中的信号来改变该行为,例如: G。通过插入
trap "echo interrupted" INT
在for c_p
循环之前的某个地方。