bash – 为什么测试“$?”来查看命令是否成功,反模式?
我看到
here测试是否$?是零(成功)或其他东西(失败)是反模式,但我无法在其他任何地方找到它.
坚持Wikipedia反模式的定义:“反模式(或反模式)是对反复出现的问题的常见反应,这种反复出现的问题通常是无效的,并且可能会产生极大的反作用.”为什么这会是反模式? 解决方法
这是一个反模式,因为如果您根本不需要记录退出状态,它会引入不存在的复杂性.
if your_command; then ... 比错误要少得多 your_command if [ "$?" -eq 0 ]; then ... 有关可能出错的事例:考虑traps,甚至添加新的echo语句进行调试,修改$?.对于读者来说,在不改变逻辑流的情况下,运行your_command的单独行不能在其下面添加任何内容,这在视觉上并不明显. 那是: your_command echo "Finished running your_command" >&2 if [ "$?" -eq 0 ]; then ... …正在检查回声,而不是实际命令. 因此,如果您确实需要以更精细的方式处理退出状态,而不是立即分支它的值是否为零,则应该在同一行上收集它: # 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 -e your_command if [ "$?" -eq 0 ]; then ... ……永远不会(除了一些困扰设置-e行为的角落案例和警告)到达任何价值为$的if语句?除了0之外,因为set -e将在这种情况下强制退出.相比之下: set -e if your_command; then ... …将your_command的退出状态标记为已测试,因此不会将其视为强制脚本按set -e退出. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |