如何实现仅显示非零命令退出码且避免set -x下产生额外输出
如何实现仅显示非零命令退出码且避免set -x下产生额外输出
我明白你的需求啦——既要只在命令退出码非零时显示「退出码|」的前缀,又要在开启set -x调试模式时不产生多余的输出行。原来用PROMPT_COMMAND函数的写法确实会在调试模式下输出好几行冗余信息,那咱们可以用更巧妙的方式来解决:
方案一:简化PROMPT_COMMAND,大幅减少调试冗余
把原来的函数式PROMPT_COMMAND换成单行赋值,这样调试时的输出会从4行缩减到1行,简洁很多:
# 替换掉你原来的PROMPT_COMMAND函数和赋值 PROMPT_COMMAND='PROMPT_ECODE=$(( $? ? "$?|" : "" ))' PS1='${PROMPT_ECODE}'"$PS1"
这个单行命令会在每次显示提示符前,根据$?的值给PROMPT_ECODE赋值:如果退出码非零,就设为「$?|」;如果是0,就设为空字符串。逻辑和你原来的完全一致,但调试时的冗余输出少了很多。
方案二:纯命令替换+临时关调试,彻底消除额外输出
如果想要在set -x下完全看不到任何和退出码显示相关的调试输出,可以直接修改PS1,不需要依赖PROMPT_COMMAND:
# 直接修改PS1,无需PROMPT_COMMAND PS1='$(set +x; e=$?; echo ${e:+${e##0}|}; set -x)'"$PS1"
这个写法的妙处在于:
- 先用
set +x临时关闭调试模式,这样后面的命令不会被set -x追踪输出; - 把退出码赋值给变量
e,用参数展开实现逻辑:- 当
e=0时,${e##0}会把0匹配掉得到空字符串,${e:+空|}最终输出空; - 当
e非零时,${e##0}就是e本身,${e:+e|}就会输出「e|」;
- 当
- 最后用
set -x重新开启调试模式,不影响后续命令的调试。
这样即使开启了set -x,这个退出码判断的过程也不会产生任何额外输出,完美符合你的要求。
备注:内容来源于stack exchange,提问作者iBug
相关产品推荐
相关产品推荐

