捕获 bash 输出的语法有何不同?

捕获 bash 输出的语法有何不同?

我通常使用

./aaa.sh 2>&1 | tee -a log

但发现了一个似乎更简单的新命令:

./aaa.sh &> log

那么在第二种情况下我要放弃什么呢?

答案1

苹果和橙子。但首先...

2>&1vs而言&>,他们都充当指挥标准错误到同一个地方标准输出正在被引导至。

但是您将放弃第二个的可移植性,因为它不符合 POSIX 标准,并且使用它的任何脚本只能与支持它的 shell 一起使用。

话虽如此,正如 Bash 手册页中所描述的那样,它们“在语义上是等效的”......

重定向标准输出和标准错误有两种格式:

      &>word    and
      >&word

在这两种形式中,优选第一种。这在语义上等价于

      >word 2>&1

使用第二种形式时,单词可能不会扩展为数字或 -。如果是这样,出于兼容性原因,其他重定向运算符将适用(请参阅下面的复制文件描述符)。

然而,还有更多的事情要做。您还使用了tee为第一个版本添加附加功能的命令。它将采取其标准输入输入并将其定向到两个不同的地方:标准输出(如果您以交互方式运行此命令,通常是您的屏幕/终端)以及包含数据的指定文件附加的到它(-a说追加而不是覆盖)。

将此与第二个版本进行比较,其中组合标准输出标准错误覆盖log文件并且不会显示在您的屏幕/终端上。

结论:正如一开始提到的,这实际上是两个不同的命令,但是,延伸等价的概念,一般来说第一个版本更优越,因为它是便携式的aaa.sh即使它被保存到文件中, 您也可以看到输出。当然,如果您不想看到它或者您想删除以前的文件内容,那就另当别论了。苹果和橙子。

答案2

两件事情:

  • tee将其输入打印到指定文件中,标准输出,实际上到您的终端。像>or 这样的直接重定向&>只会导致文件被写入。

  • tee -a 追加对于指定的文件,a>&>重定向会覆盖它。使用>>or&>>>> file 2>&1附加重定向。

相关内容