捕获 bash 输出的语法有什么区别?

aja*_*elu 2 bash pipe io-redirection tee

我通常使用

./aaa.sh 2>&1 | tee -a log
Run Code Online (Sandbox Code Playgroud)

但是发现了一个似乎更容易的新命令:

./aaa.sh &> log
Run Code Online (Sandbox Code Playgroud)

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

B L*_*yer 7

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

2>&1vs 而言&>,它们都用于将stderr定向到stdout被定向到的同一位置。

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

话虽如此,如 Bash 手册页所述,它们是“语义等效的”...

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

      &>word    and
      >&word
Run Code Online (Sandbox Code Playgroud)

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

      >word 2>&1
Run Code Online (Sandbox Code Playgroud)

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

然而,还有更多。您还使用了tee为第一个版本添加附加功能的命令。它将获取其stdin输入并将其定向到两个不同的位置:stdout(如果您以交互方式运行,通常是您的屏幕/终端)和将附加数据的指定文件(-a说是附加而不是覆盖)。

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

结论:正如开头提到的,这实际上是两个不同的命令,但是,扩展等效性的概念,一般来说,第一个版本更好,因为它是可移植的,并且 您可以在aaa.sh保存到一份文件。当然,如果你不想看到那个或者你想删除以前的文件内容,那就是另一回事了。苹果和橙子。