如何在执行的Ruby脚本失败时中途退出Bash脚本?
解决Bash脚本执行Ruby脚本时中途退出的问题
核心实现:让Bash在Ruby脚本失败时立即退出
Bash默认会忽略命令的退出状态继续执行后续命令,要实现中途退出,有两种常用方式:
方式1:在脚本开头设置set -e
直接在Bash脚本顶部添加set -e,它会让脚本在任一命令以非零状态退出时立即终止执行。修改后的脚本如下:
#!/bin/bash set -e ruby script_1.rb ruby script_2.rb ruby script_3.rb
只要某个Ruby脚本以exit 1退出,Bash脚本就会立刻停止,不再执行后续的Ruby脚本。
方式2:手动检查每个Ruby脚本的退出状态
如果需要更精细的控制(比如失败时输出自定义提示),可以手动捕获每个命令的退出状态。Bash里可以用$?获取上一个命令的退出码,示例:
#!/bin/bash ruby script_1.rb if [ $? -ne 0 ]; then echo "script_1.rb执行失败" exit 1 fi ruby script_2.rb if [ $? -ne 0 ]; then echo "script_2.rb执行失败" exit 1 fi ruby script_3.rb if [ $? -ne 0 ]; then echo "script_3.rb执行失败" exit 1 fi
这种方式能针对每个脚本的失败做单独处理,再决定是否退出。
关于Ruby脚本的退出状态捕获
不需要Ruby脚本额外抛出异常,只要Ruby脚本在失败时执行exit 1(或者任何非零值),Bash就能通过$?捕获到它的退出状态。
比如Ruby脚本里这样写,就能让Bash识别到失败:
# script_1.rb示例 begin # 业务逻辑 result = some_operation if result.nil? exit 1 # 执行失败时退出,返回非零码 end rescue StandardError => e exit 1 # 捕获异常后也可以返回非零码退出 end
不管是主动调用exit 1,还是未捕获的异常导致Ruby进程崩溃(此时Ruby默认也会返回非零退出码),Bash都能感知到并触发后续的退出逻辑。
内容的提问来源于stack exchange,提问作者Dante
相关产品推荐
相关产品推荐

