我是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。这种语法究竟如何工作?
感谢您的回答。
答案 0 :(得分:2)
Bash内置命令if
不使用程序的输出来确定条件,它使用返回代码或退出状态用作条件的“命令”。
使用例如
if anycommand; then
...
fi
相当于
anycommand
if [ $? == 0 ]; then
...
fi
anycommand
可能包含任何类型的选项和重定向。如果您有一系列管道命令,则使用的退出代码是最后一个前台命令之一,因此在a | b | c
中使用c
的退出代码。
另请注意,退出代码为零被认为是成功的,即在条件中使用时为真。任何非零的退出代码都是false。
在C程序中,退出代码是main
函数返回的值,或传递给exit()
函数的值。
在Bash脚本或函数中,退出代码是传递给内置exit
或return
命令的内容。
答案 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条件。