BASH:在子shell中运行的C程序中的错误会破坏主shell

时间:2016-01-07 09:16:10

标签: bash

我有一个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程序会破坏规则。

2 个答案:

答案 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循环之前的某个地方。