car*_*ter 98 shell-script error-handling
我目前正在探索 Debian 软件包,并且我一直在阅读一些代码示例。例如,postinst脚本中的每一行都是一个模式。
some command || true
another command || true
Run Code Online (Sandbox Code Playgroud)
因此,如果某些命令失败,则该行返回 true,但我看不出这会如何影响程序的输出。
Ste*_*itt 174
这种模式的原因是 Debian 软件包中的维护者脚本倾向于以 开头set -e,这会导致 shell 在任何命令(严格来说,管道、列表或复合命令)以非零状态退出时立即退出。这可以确保错误不会累积:一旦出现问题,脚本就会中止。
在允许脚本中的命令失败的情况下,添加|| true可确保生成的复合命令始终以状态零退出,因此脚本不会中止。例如,删除一个目录不应该是一个致命错误(防止一个包被删除);所以我们会用
rmdir ... || true
Run Code Online (Sandbox Code Playgroud)
因为rmdir没有选项告诉它忽略错误。
Mic*_*elt 34
虽然它不会影响刚刚运行的程序的输出 - 它允许调用者继续进行,好像一切都好,也就是影响未来的逻辑。
改写:它掩盖了上一个命令的错误状态。
michael@x071:[/usr/sbin]cat /tmp/false.sh
#!/bin/sh
false
michael@x071:[/usr/sbin]cat /tmp/true.sh 
#!/bin/sh
false || true
michael@x071:[/usr/sbin]sh /tmp/false.sh; echo $?
1
michael@x071:[/usr/sbin]sh /tmp/true.sh; echo $? 
0
Run Code Online (Sandbox Code Playgroud)