bash 中什么时候需要使用“|| true”?

When is the use of "|| true" needed in bash?

我使用 Travis CI 为我的开源项目做单元测试。在配置我的 .travis.yml 文件时,我看到了其他几个项目的示例,以及在脚本中的某些条件语句之后对 || true 的一些不一致使用。我见过它们有两种格式。

当语句作为条件执行时,我理解需要 || true 来确保命令 returns "success" 并允许脚本继续。名称不匹配将是错误的,在 && 之后省略后续命令的执行,但在 || true.

之后最终 return 成功
- '[ "${TRAVIS_OS_NAME}" = "osx" ] && brew install ant || true'

不过,我也见过在if ... fi条件句之后应用的条件句,比如这个例子:

- if [ "${TRAVIS_CPU_ARCH}" == "arm64" ]; then 
    sudo apt-get install openjdk-11-jdk libltdl-dev;
    export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-arm64;
    export PATH=$JAVA_HOME:$PATH; 
  fi || true

我自己的测试表明是否包含它没有区别。例如,这个条件不会停止测试,即使它的计算结果为 false。例如:

if [ "${TRAVIS_BRANCH}" == "coverity_scan" ]; then exit 0; fi

Travis 生成此输出,显示 "true" 结果:

The command "if [ "${TRAVIS_BRANCH}" == "coverity_scan" ]; then exit 0; fi" exited with 0.

脚本在 "master" 分支上毫无怨言地继续通过这一点。我的评估是 if [ false ] then; ...; fi 条件要么 return 为真,要么实际上是无操作,并且不需要。

在条件为假的情况下,在 if ... fi 条件之后添加 || true 是否必要,甚至有用? (假设我希望脚本在条件为真且其中的语句失败时失败。)

When is the use of “|| true” needed in bash?

当脚本在环境中执行时,如果任何表达式 return 具有非零退出状态,则脚本的执行将停止。这样的例子是 set -e 或像你在 ci/cd 工具中的例子。

外链:

false && true
#  $? is 1

将以非零退出状态退出。我发现人们在此类脚本中使用 || true 或更短的 ||: 来使带有 && 的命令列表以零状态退出,即使其中一个命令失败也是如此。通常:

 [ -e "env_file" ] && . "env_file" ||:

I have also seen the conditional applied after if ... fi conditionals

您展示的这个特定用法似乎是某些保护过度的程序员遗留或插入的。 export 总是 return 退出状态为零。

如果 if 中的表达式将以零退出状态退出,则 if 主体将执行。 if 命令的退出状态是最后执行的命令的退出状态(通常在组中)。

if true; then
   dont care;
   dont care;
   false
fi 
#  exits with exit status of false

因此程序员可以插入|| true使if表达式的退出状态为零。

My assessment is that an if [ false ] then; ...; fi

[ false ] returns 具有零退出状态,因为字符串 false 具有非零长度。我想你是想用 if false.

执行命令 false

Is || true necessary, or even useful, to add after a if ... fi conditional in the case where the conditional is false?

如果没有像代码中那样执行的 ifelse 块或 else 块,那么不会,if 将 return 成功。我认为手册中的 qoute 最好 bash manual Conditional Constructs if:

if

... The return status [of if] is the exit status of the last command executed, or zero if no condition tested true.