在Shell中,|| : 是什么意思?

3
我正在查看一个shell脚本代码,但不知道双竖线(||)后面带冒号(:)的用途是什么,请问能解释一下吗?例如:
   $ <some_command> >/dev/null 2>&1 || :
2个回答

7

|| 是布尔或操作符。

: 是一个无操作的命令,什么也不做并以真实状态退出。

因此,anything || : 无条件返回真。

因此,some_command_that_may_fail ||: 将始终成功。

如果使用了 set -e 或 ERR trap,但您不希望脚本在命令失败时退出或引发错误,则这非常重要。


哇,那么这应该被禁止 :) 这比空的 try-catch 块还糟糕。谢谢! - the_marcelo_r
2
为什么要禁止?有时候,如果一个命令执行失败了,你并不在意。例如,如果 grep 没有找到匹配项,它会执行失败,但你可能不认为这是脚本的失败,因此 grep string file.txt || : 将防止你的脚本退出。 - chepner
1
@theMarceloR,我不会说更糟糕——在逐行显式地编写代码时,这有时是必要的。如果你已经处于错误处理代码中,有时候你确实需要继续执行清理操作即使其中一部分失败了。 - Charles Duffy
谢谢大家,我只是在说笑。每个人都有权根据他们的目标对他们的代码做任何他们想做的事情,尽管我认为,在我看到的这种情况下(在部署失败的情况下压缩日志的命令),我不确定我是否完全同意这种方法。我的意思是,zip命令经常会失败吗? :) - the_marcelo_r
1
zip 命令肯定会失败。文件可能会在其下被移动,截断,调整大小或删除,目标位置可能会空间不足... 如果此脚本在源代码控制中,则建议查看更改者以及他们附加到更改的票证。如果这是为了在 logrotate 在 zip 运行时启动时使故障静默... 那么,这并不会让人感到意外。 - Charles Duffy

2

冒号表示没有操作,双竖线表示或运算,因此...

执行某个命令或者(如果该命令失败)执行 :(即无操作)

|| 表示仅在第一个命令失败时才执行第二个命令。在这种情况下,第二个命令代表“不执行任何操作”


1
不完全是“什么也不做”:将退出状态设置为“true”。 - glenn jackman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接