1. 程式人生 > >Linux shell : Command 2>&1

Linux shell : Command 2>&1

之前看到如下shell 命令,一頭霧水:

ls temp >list.txt 2>&1
ls temp >/dev/null 2>&1


查閱之後,明白此語句含義,特此記錄.

首先說明幾點:

  1. 在unix和類unix(linux之類)中以檔案描述符的形式開啟一個檔案,這個檔案描述符是一個非負數。
  2. 0代表標準輸入,1代表標準輸出,2代表標準錯誤輸出
  3. 預設的情況下是1 所以 > 相當於 1>
  4. shell命令的執行是從左往右

ls temp >list.txt 2>&1 (ps:temp是個不存在的目錄)
ls temp >list.txt :

把標準輸出重定向到list.txt檔案中,在這裡,就是把temp目錄下所有的檔案,列出來,然後輸出到list.txt檔案
如果沒有這個重定向,那麼標準輸出預設是控制檯
標準輸出的控制代碼應該是1 ,所以,完整的寫法應該是:ls temp 1>list.txt


2>&1 :
在此處 ,表示把標準錯誤輸出寫入到list.txt檔案
經過這個重定向,標準輸出和標準錯誤輸出都重定向到了list.txt中
結果如下:
root:ls temp >list.txt 2>&1
root:/opt/tmp # more list.txt
ls: cannot access temp: No such file or directory //error 資訊在檔案裡


ls temp >/dev/null 2>&1

這個表示把標準輸出,以及標準錯誤輸出都捨棄了,不顯示也不儲存


如果換一下順序,如何?
ls temp 2>&1 >list.txt
標準錯誤輸出定向到控制檯,標準內容輸出定向到list.txt
結果如下:
root:/opt/tmp # ls temp 2>&1 >out.txt
ls: cannot access temp: No such file or directory //error資訊直接輸出到控制檯


總結:
ls temp :表示標準內容輸出和標準錯誤都輸出到控制檯
等同於:ls temp>&1
ls temp >list :表示標準內容輸出到list檔案中,標準錯誤輸出還是在控制檯
等同於:ls temp 1>list

ls temp >list 2>&1 :表示標準內容輸出到list檔案中,標準錯誤輸出也在list檔案中
等同於:ls temp >list 2>list
ls temp 1>list 2>list
ls temp 1>list 2>&1

ls temp 2>& >list :標準錯誤輸出也在控制檯,表示標準內容輸出到list檔案中
等同於:ls temp 2>& 1>list




參考文獻:

http://www.cnblogs.com/caolisong/archive/2007/04/25/726896.html
http://www.ningoo.net/html/2007/shell_scripts_stderr_stdout.html