如何用最简Bash语法实现仅在命令退出码为0/1时执行后续命令?是否有退出码重映射工具?
解决命令退出码0/1时执行后续命令的紧凑Bash语法及退出码重映射工具
问题背景
diff命令与&&的兼容性不佳——当文件存在差异时它会以退出码1终止,但我们仅需获取diff的输出内容,无论是否存在差异;不过遇到ENOENT这类真实错误时仍需终止程序。我们需要:
- 用最紧凑的Bash语法实现「当前一个命令退出码为0或1(而非大于1)时执行下一个命令」
- 了解是否存在可用于执行命令并「重映射」其退出码的标准工具
紧凑Bash语法实现
极致紧凑写法(代码高尔夫友好)
diff f1 f2;(( $?<=1 ))&&cmd
解释:先执行diff,随后通过Bash算术判断(( $?<=1 ))检查退出码,满足条件则执行后续命令cmd。该写法仅用21个字符(不含命令名),是压缩后的最优解。
可读性优先变体
若无需极致压缩,以下写法逻辑一致但更易理解:
diff file1 file2 (( $? <= 1 )) && next_command
链式判断写法
diff f1 f2 || (( $?==1 )) && cmd
逻辑:若diff退出码为0,直接触发&&执行cmd;若退出码为1,||后的判断返回0,同样触发&&;若退出码大于1,判断返回非0,后续命令不执行。
退出码重映射的实现方案
没有专门的单一标准工具直接实现退出码重映射,但可通过Shell内置逻辑或通用工具快速实现:
Bash函数封装(通用复用方案)
定义极简函数实现退出码重映射,适合重复场景:
remap() { "$@"; ec=$?; return $(( ec>1 ? ec : 0 )); }
使用方式:
remap diff file1 file2 && next_command
该函数会将命令的退出码0/1转为0,大于1的错误码保持不变,完美适配&&的执行逻辑。
临时单行处理(无需定义函数)
用awk一行实现临时重映射:
diff file1 file2; awk -v ec=$? 'BEGIN{exit ec>1?ec:0}' && next_command
内容的提问来源于stack exchange,提问作者Szczepan Hołyszewski
相关产品推荐
相关产品推荐

