如何在Bash脚本中忽略Segmentation fault并执行后续命令
解决Bash脚本因程序段错误终止后续命令的问题
你的问题核心是set -e导致脚本在./cosim返回非零退出码时直接终止——程序发生段错误时,退出码通常是139(对应信号SIGSEGV,128+11),触发了set -e的终止逻辑,所以后续的echo命令无法执行。
以下是几种可行的解决办法:
方法1:忽略程序的退出码
在执行命令时添加|| true,强制让这条命令的返回值为0,这样set -e不会触发终止:
#!/bin/bash set -e time ./cosim || true echo "After execution"
方法2:捕获并处理退出码
如果需要区分段错误和其他错误(比如正常的非零退出),可以先捕获退出码,再根据情况决定是否继续:
#!/bin/bash set -e time ./cosim exit_code=$? # 段错误的退出码是139,仅在这种情况继续执行后续命令 if [ $exit_code -eq 139 ]; then echo "程序发生段错误,继续执行后续步骤" else # 其他错误仍按照set -e的逻辑终止脚本 exit $exit_code fi echo "After execution"
方法3:临时关闭set -e
如果只是针对这一条命令关闭set -e的效果,可以用set +e和set -e包裹:
#!/bin/bash set -e # 临时关闭set -e set +e time ./cosim exit_code=$? # 恢复set -e set -e # 同样可以根据退出码处理 if [ $exit_code -eq 139 ]; then echo "程序段错误,继续执行" else exit $exit_code fi echo "After execution"
补充说明
- 程序发生段错误时的退出码:Bash中,进程因信号终止时,退出码为
128 + 信号编号。SIGSEGV(段错误)的信号编号是11,所以退出码是139,这可以用来精准判断是否是段错误导致的退出。 set -e的作用:当脚本中任何命令返回非零退出码时,立即终止脚本执行,这也是你的后续命令无法运行的直接原因。
内容的提问来源于stack exchange,提问作者Lane
相关产品推荐
相关产品推荐

