問題引出
在Linux下進行日常操作時,尤其是當執行bash腳本時,經常會看到在執行腳本指令後面會緊跟一個2>&1的指令,比如指令:
./test1.sh > a.log 2>&1
以前碰到總是Ctrl+C和Ctrl+V,今天下午學習了一下,算是知其然也知其是以然了,記錄一下。
追根溯源
先看 tesh1.sh,如下圖,内容很簡單, t 表示一條不存在的錯誤指令.

再解釋 0 1 2 分别代表的含義:
- 0表示stdin 表示标準輸入
- 1表示stdout 表示标準輸出
- 2表示stderr 表示标準錯誤
接下來解釋 ./test1.sh > a.log
./test1.sh > a.log 等同 ./test1.sh 1 > a.log 也就是說将test1.sh這個腳本執行标準輸出結果(1)寫入a.log
簡單說标準輸出 1 是可以省略不寫的,前者是後者的省略情況
重點說2>&1
2 > &1
2表示标準錯誤(對應test1中t這個指令觸發的錯誤)
>表示輸出定向符
&1表示标準輸出對應的檔案位址,在本例中由于标準輸出對應的檔案是a.log(依據是1 > a.log), 是以标準錯誤的資訊也會存儲到a.log裡面
簡單解釋下 2 > &1 表示如果我的test1在執行過程中出現了标準錯誤的資訊,那麼我的标準錯誤的存儲資訊的存儲位置就是标準輸出的存儲位置(&1表示引用标準輸出的存儲位置)
細節部分
./test1.sh > a.log 2>&1 是否等于./test1.sh > a.log 2 > a.log ?
答案是否定的。 2>&1隻會打開一次a.log檔案,而 2 > a.log 會重新打開檔案,在本例中如果換成後者,那麼date的輸出就會把t這個指令産生的标準錯誤資訊給覆寫掉。
./test1.sh > a.log 2>&1 對應的a.log如下圖:
./test1.sh > a.log 2 > a.log 對應的a.log如下圖:
可見丢失的資訊就是被覆寫掉的資訊。