我是bash脚本的新手,我试图理解以下内容:
# Verify pre-req environment
command -v kubectl > /dev/null 2>&1 || { echo "kubectl pre-req is missing."; exit 1; }
我不理解这部分:command -v kubectl > /dev/null 2>&1
,因此,如果失败或失败,我们会将输出重定向到/ dev / null,如果我正确理解它,则表示在所有情况下都忽略它。那么在什么情况下将执行以下代码行?
{ echo "kubectl pre-req is missing."; exit 1; }
在这种情况下||
的行为如何?
答案 0 :(得分:2)
我不理解这部分内容:
command -v kubectl > /dev/null 2>&1
,因此,如果失败或失败,我们会将输出重定向到/ dev / null,如果我正确理解它,则表示在所有情况下都忽略它。
您误解了; command -v kubectl > /dev/null 2>&1
的任何部分都与“如果失败”与“没有”没有任何关系。
相反,>
和2>
重定向两种不同类型的输出; >
(或1>
)将命令写入的内容重定向到标准输出,2>
将命令写入的内容重定向到标准错误 。该命令是否将任何内容写入标准输出都取决于它最终成功还是失败。是否将任何内容写入标准错误与是否成功或失败无关;是否将任何内容写入标准输出与是否将任何内容写入标准错误无关。
例如,这是一条同时打印到标准输出和标准错误,然后成功返回的命令:
( echo "this is on standard output" ; echo "this is on standard error" >&2 ; exit 0 )
这是一个同时输出到标准输出和标准错误,然后失败的图形:
( echo "this is on standard output" ; echo "this is on standard error" >&2 ; exit 1 )
相反,||
确实与命令是成功(退出为零)还是失败(退出不是零)有关。
答案 1 :(得分:1)
如果kubectl
命令以非零退出状态退出,则将执行||
之后的代码。
$ sh -c 'exit 42' && echo "exit status zero" || echo "exit status non-zero"
exit status non-zero
$ sh -c 'exit 0' && echo "exit status zero" || echo "exit status non-zero"
exit status zero
答案 2 :(得分:1)
||
是逻辑 或 ,并且基于先前的命令退出代码(0表示true,而其他值为false)起作用。
在这种情况下,仅当第一个命令(kubectl ..)退出代码不为0(即失败)时,它才会执行echo部分。 exit 1
会使整个命令失败,否则echo命令的退出代码将为0。
答案 3 :(得分:1)
||
用于bash中的OR条件。
举个简单的例子,让我们看看
cmd1 || cmd2
发生的情况是,如果cmd1成功(即退出代码0),则不会执行cmd2。仅当cmd1失败时才执行cmd2。
这是返回退出代码如此重要的原因之一。
有关更多详细信息,请查看这篇文章:Boolean operators ( &&, -a, ||, -o ) in Bash