我使用Travis CI对我的开源项目进行单元测试。在配置.travis.yml
文件时,我看到了其他几个项目的示例,并且在脚本中的某些条件之后对|| true
的使用不一致。我以两种格式看过它们。
当该语句作为条件语句执行时,我了解需要|| true
以确保命令返回“成功”并允许脚本继续。名称上的不匹配将为假,在&&
之后省略以后命令的执行,但最终在|| 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_OS_NAME}" == "windows" ]; then
export JDK="[email protected]";
fi
即使操作系统不是“ windows”,脚本也可以继续进行到此为止。我的评估是,if [ false ] then; ...; fi
条件要么返回true,要么实际上是空操作,因此不需要。
|| true
在条件为假的情况下在if ... fi
条件后添加是否必要,甚至有用? (假设我希望脚本在条件为true且其中的一条语句失败的情况下失败。)
何时使用“ || bash中需要“ true”吗?
当脚本在环境中执行时,如果任何表达式以非零退出状态返回,则执行将停止。此类示例使用set -e
或类似ci / cd工具中的示例。
链:
false && true
# $? is 1
将以非零退出状态退出。我发现人们在此类脚本中使用|| true
或更短的||:
来使带有&&
的命令列表以零状态退出,即使其中一个命令失败。通常:
[ -e "env_file" ] && . "env_file" ||:
我也看到了if ... fi有条件的条件之后应用的条件
您显示的这种用法似乎是一些过分保护的程序员遗留下来的或插入的。 export
始终以零退出状态返回。
如果if
中的表达式将以零退出状态退出,则if
主体将执行。 if
命令的退出状态是最后执行的命令的退出状态(通常成组出现)。
if true; then
dont care;
dont care;
false
fi
# exits with exit status of false
因此程序员可以插入|| true
以使if
表达式的退出状态为零。
我的判断是,如果[false] then; ...; fi
[ false ]
返回零退出状态,因为字符串false
具有非零长度。我认为您打算用false
执行命令if false
。
是||如果条件为假,则在if ... fi条件之后添加是真的必要,甚至有用吗?
如果没有else
块,则没有。但是:
if false; then
:;
else
false
fi