在if语句bash中有2>& 1

时间:2016-05-19 08:53:24

标签: bash if-statement

我是bash的初学者,我试图了解别人的bash脚本。该脚本包含几个后续的带有某些参数的rscripts调用。所有这些if语句的语法大致相同,如下所示:

if Rscript -options > log_file.txt 2>&1
    script works, do smth.
else
    script failed, leave the ship!

我简直无法理解为什么这个if语句会做什么。我知道2>& 1"结合了" stderr和stdout。这种语法究竟如何工作?

感谢您的回答。

3 个答案:

答案 0 :(得分:2)

Bash内置命令if不使用程序的输出来确定条件,它使用返回代码退出状态用作条件的“命令”。

使用例如

if anycommand; then
...
fi

相当于

anycommand
if [ $? == 0 ]; then
...
fi

anycommand可能包含任何类型的选项和重定向。如果您有一系列管道命令,则使用的退出代码是最后一个前台命令之一,因此在a | b | c中使用c的退出代码。

另请注意,退出代码为零被认为是成功的,即在条件中使用时为真。任何非零的退出代码都是false。

在C程序中,退出代码是main函数返回的值,或传递给exit()函数的值。

在Bash脚本或函数中,退出代码是传递给内置exitreturn命令的内容。

答案 1 :(得分:0)

数字是文件描述符编号:2是标准错误输出(stderr),1是标准输出(stdout),因此通过写2>& 1,你会说:从2重定向输出(stderr)与1(stdout)相同,在命令中它表示log_file.txt。

答案 2 :(得分:0)

在上面提到的情况中。我们正试图在if条件下执行脚本。

如果Rscript -options> log_file.txt 2>& 1

根据上述声明, Rscript是一个脚本和变量" options"存储运行脚本的参数。当控制执行条件时,首先它使用存储在选项中的参数执行Rscript文件。在执行Rscript期间,与Rscript相关的所有打印语句都将重定向到" log_file.txt"因为"> log_file.txt&#34 ;.除了print语句之外,由于2>& 1语句,在执行脚本期间产生的错误也将被重定向到文本文件。

2>& 1,通过此语句我们指示控制器将所有stderr记录到stdout,其中" log_file.txt"在这种情况下被认为是stdout。

最后,如果Rscript返回true值,那么控制将进入if条件,如果不是control将执行else条件。