使用||之后> / dev / null 2>&1 || {出口1}

时间:2019-09-25 18:11:30

标签: bash shell

我是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; }

在这种情况下||的行为如何?

4 个答案:

答案 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