【问题标题】:2>&1 in if statement bash2>&1 在 if 语句 bash
【发布时间】:2016-05-19 18:45:45
【问题描述】:

我是 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 “结合”了标准错误和标准输出。这个语法究竟是如何工作的?

感谢您的回答。

【问题讨论】:

  • 阅读这个答案:cmd 2>&1 > log vs cmd > log 2>&1.
  • 你试过阅读the Bash manual page吗?
  • 如果我不够具体,我很抱歉。让我困惑的是 bash 如何知道语句“Rscript -options > log_file.txt 2>&1”在没有错误时为 TRUE,而在有错误时为 FALSE。

标签: bash if-statement


【解决方案1】:

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

使用例如

if anycommand; then
...
fi

等价于

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

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

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


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

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

【讨论】:

    【解决方案2】:

    数字是文件描述符的编号:2 是标准错误输出(stderr),1 是标准输出(stdout),所以写 2>&1 是在说:将输出从 2(stderr)重定向到与 1 (stdout) 相同,在您的命令中表示 log_file.txt。

    【讨论】:

      【解决方案3】:

      在您提到的上述情况下。我们正在尝试在 if 条件下执行脚本。

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

      根据上面的说法, Rscript 是一个脚本,变量“options”存储了运行脚本的参数。当控制执行 if 条件时,首先它使用存储在选项中的参数执行 Rscript 文件。在 Rscript 执行过程中,所有与 Rscript 相关的打印语句都将重定向到“log_file.txt”,因为“> log_file.txt”。除了 print 语句,脚本执行过程中产生的错误也会被重定向到文本文件,因为 2>&1 语句。

      2>&1,通过该语句,我们指示控制器将所有标准错误记录到标准输出,其中“log_file.txt”在这种情况下被视为标准输出。

      最后,如果Rscript返回真值则控制进入if条件,否则控制执行else条件。

      【讨论】:

      • 感谢您的回答。看来我不清楚。让我感到困惑的是 bash 如何知道语句“Rscript -options > log_file.txt 2>&1”在没有错误时为 TRUE,而在有错误时为 FALSE(我只猜这是 if 语句的作用,因为脚本的上下文)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-11
      • 2015-09-16
      • 2015-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多