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.
我使用 Travis CI 为我的开源项目做单元测试。在配置我的 .travis.yml
文件时,我看到了其他几个项目的示例,以及在脚本中的某些条件语句之后对 || true
的一些不一致使用。我见过它们有两种格式。
当语句作为条件执行时,我理解需要 || true
来确保命令 returns "success" 并允许脚本继续。名称不匹配将是错误的,在 &&
之后省略后续命令的执行,但在 || true
.
- '[ "${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.