bash 后缀`||:`

Ell*_*iew 6 bash

在 bash 中,语法有||:什么作用?


例子

$ ls foo ||:
Run Code Online (Sandbox Code Playgroud)

除了总是返回成功之外,这还有什么特别之处吗?

$ ls foo ||:; echo $?即使ls foo由于foo不存在而失败,输出是否始终为零?

我在一个以set -e. 所以我猜它可以确保不会发生错误,因此脚本不会立即退出,即使以 this 为后缀的命令返回错误。

Edu*_*ani 8

如果之前的命令没有返回成功,它只会返回成功。

使用set -e(aka set -o errexit),返回错误的命令行将中止脚本。如果将此添加||:到命令行的末尾,则不会出现错误(因为,如果存在,下一个命令将返回 true)。

它基本上是说:如果上一个命令中有错误,请运行,true以便命令行结束而没有错误并且脚本可以继续运行。

此脚本将中止而不显示日期,因为ls返回错误:

set -e
ls -l /tmp/nonexistentfile
date
Run Code Online (Sandbox Code Playgroud)

但是这个脚本不会中止,它会显示日期,因为最后一个命令是:( true):

set -e
ls -l /tmp/nonexistentfile || :
date
Run Code Online (Sandbox Code Playgroud)


Dav*_*258 4

这里有两个独立的语法:

||  This is the OR symbol. 
:   This is a dummy command which will return a success (return code 0)
Run Code Online (Sandbox Code Playgroud)

与命令结合使用,其效果是首先运行该命令并使该行返回“成功”,而不管第一个命令的返回代码如何。由于该命令将返回 True,因此:将返回 OR(不成功执行任何操作)。

如果脚本中的任何语句返回 False,则单独set -e具有退出脚本的效果。因此||:,充当“守卫”,即使该行上的命令返回 False,也确保脚本继续执行

  • @HaukeLaging `true <nofile` 将导致完全相同的错误,因为该错误是由 bash 的文件打开阶段产生的,而不是 `true` 或 `:` 命令。 (6认同)
  • `:` 不是 true 的符号,它是一个虚拟命令,即它不执行任何操作并忽略任何参数。与注释符号相反,该行的其余部分会定期执行。这对于调试或者如果您想要执行任何命令(如“${parameter:=word}”)的一部分的内容很有用。shell 内置 `:` 的行为类似于 shell 内置 `true`。但我不会称其为“真实的象征”。`:` 命令仍然会导致非零退出代码:`: <nofile` (2认同)