何时在 Bash 中使用“|| true”?

che*_*eza 4 shell bash shell-script

我对“ ”很好奇|| true,写了下面这对例子。

示例#1

    #!/usr/bin/env bash
    
    rm some_random_file_that_does_not_exist
    
    echo "End of program"
Run Code Online (Sandbox Code Playgroud)

执行时 if 产生以下结果:

$ ./remove.sh
rm: cannot remove 'some_random_file_that_does_not_exist': No such file or directory
End of program
Run Code Online (Sandbox Code Playgroud)

例子#2

#!/usr/bin/env bash

rm some_random_file_that_does_not_exist || true

echo "End of program"
Run Code Online (Sandbox Code Playgroud)

执行时会产生以下结果:

$ ./remove.sh
rm: cannot remove 'some_random_file_that_does_not_exist': No such file or directory
End of program
Run Code Online (Sandbox Code Playgroud)

我能看出的唯一区别是,在Example#1 中,尝试删除不存在文件的行的结果代码是1,而在Example#2 中,结果代码是0(零)。

我理解这个“”的方式|| true是确保“”运算符左侧的命令的执行||以结果代码零结束。

|| true所以我的问题是...除了这个原因之外,还有其他原因可以证明在 Bash 中的命令末尾使用“ ”是合理的吗?

dim*_*ich 12

|| trueerrexit当设置 shell 选项时,可用于抑制出错时立即退出;该选项可以set -e通过set -e在脚本中显式地启用,或者通过使用显式解释器和选项调用脚本来启用:bash -e scriptname。在sh类似 shell中,如bash, :(成功地不执行任何操作的实用程序)也可以用来代替true, ,如|| :

它也可以用于具有相同目的的 Makefile 配方中。

  • 关于Makefile中的用法,GNU make支持`-`前缀来忽略命令失败,但我也看到过`|| 真实`。也许是为了可移植性,我不确定其他实现。 (2认同)
  • `-` 前缀在 makefile 中肯定更惯用。但是,如果您有多行配方并且需要忽略中间错误,您可能需要使用“||true”。 (2认同)