这是一种反模式,因为它引入了复杂性,如果您根本不需要记录退出状态,那么就不会存在这种复杂性。if your_command; then ...出错的几率比your_commandif [ "$?" -eq 0 ]; then ...有关可能出错的示例:考虑陷阱,甚至考虑echo添加用于调试,修改的新语句$?。对于读者而言,在视觉上并不明显,your_command在不更改逻辑流程的情况下,单独运行的一行不能在其下添加任何内容。那是:your_commandecho "Finished running your_command" >&2if [ "$?" -eq 0 ]; then ......正在检查echo,而不是实际命令。因此,在情况下,你真的做需要应对的方式退出状态不是马上在其值是否为零分支更精细的,你应该收集它在同一行:# whitelisting a nonzero value for an example of when "if your_command" won't do.your_command; your_command_retval=$?echo "Finished running your_command" >&2 ## now, adding more logging won't break the logic.case $your_command_retval in 0|2) echo "your_command exited in an acceptable way" >&2;; *) echo "your_command exited in an unacceptable way" >&2;;esac最后:如果您附上your_command的内部if声明,这标志着它作为测试,这样你的shell不会考虑为目的的非零退出状态set -e或ERR陷阱。从而:set -eyour_commandif [ "$?" -eq 0 ]; then ......将永远不会(除非有许多困扰set -e行为的极端情况和警告)if以$?除以外的其他任何值到达该语句0,因为set -e在这种情况下将强制退出。相比之下:set -eif your_command; then ......将标记your_command为已测试的退出状态,因此不认为它会导致脚本强制退出per set -e。