Bash

擷取 bash 輸出的語法有什麼區別?

  • December 20, 2017

我通常使用

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

但是發現了一個看起來更簡單的新命令:

./aaa.sh &> log

那麼在第二種情況下我放棄了什麼?

蘋果和橙子。但首先…

至於2>&1vs &>,它們都採取行動將stderr引導到**stdout被引導到的同一位置。

但是您放棄了第二個的可移植性,因為它不符合 POSIX 標準,並且使用它的任何腳本都只能與支持它的那些 shell 一起工作。

話雖如此,如 Bash 手冊頁中所述,它們在“語義上是等效的”……

重定向標準輸出和標準錯誤有兩種格式:

      &>word    and
      >&word

在這兩種形式中,首選第一種。這在語義上等價於

      >word 2>&1

使用第二種形式時,單詞不能擴展為數字或 -。如果是這樣,出於兼容性原因,將應用其他重定向運算符(請參閱下面的複製文件描述符)。

然而,還有更多。您還使用了tee為第一個版本添加附加功能的命令。它將接受其標準輸入並將其定向到兩個不同的位置:標準輸出(如果您以互動方式執行,通常是您的螢幕/終端)和將附加數據的指定文件*(*表示-a附加而不是覆蓋)。

將此與組合的stdoutstderr覆蓋log文件並且不顯示在螢幕/終端上的第二個版本進行比較。

結論:正如在開頭提到的,這實際上是兩個不同的命令,但是,延伸等價的概念,一般來說,第一個版本是優越的,因為它是可移植的,即使它被保存到*,* 你也可以看到輸出的好處aaa.sh一份文件。當然,如果您不想看到它或者您想刪除以前的文件內容,那就另當別論了。蘋果和橙子。

引用自:https://unix.stackexchange.com/questions/412115