基礎
0:表示標准輸入stdin
1:表示標准輸出stdout,系統默認為1,可省略(即1>/dev/null等價於>/dev/null)
2:表示標准錯誤stderr
>:表示重定向(即將輸出定向到指定路徑文件,>/dev/null表示將標准輸出重定向到空設備文件,即不輸出任何信息到終端,即不顯示任何信息。)
2>&1:其中的&表示等同於的意思,即2(標准錯誤stderr)的重定向等同於1
cmd 1>a 2>a 和cmd 1>a 2>&1的區別
-
cmd >a 2>a :stdout和stderr都直接送往文件 a ,a文件會被打開兩遍,由此導致stdout和stderr互相覆蓋。
-
cmd >a 2>&1 :stdout直接送往文件a ,stderr是繼承了FD(File Descriptor)1的管道之后,再被送往文件a 。a文件只被打開一遍,就是FD1將其打開。
個人感覺有點C++中指針的意思(換湯不換葯)
兩者的不同點在於:
-
cmd >a 2>a 相當於使用了FD1、FD2兩個互相競爭使用文件 a 的管道;
-
cmd >a 2>&1 只使用了一個管道FD1,但已經包括了stdout和stderr。
從IO效率上來講,cmd >a 2>&1的效率更高。
2&>1實際用途(即錯誤的輸出被合並)
-
清理系統郵件日志(比如crontab處理)
cmd >/dev/null 2&>1 其中0表示鍵盤輸入1表示屏幕輸出2表示錯誤輸出,把標准出錯重定向到標准輸出,然后扔到/dev/null(代表空設備文件)下面去。 -
將標准錯誤stderr與stdout一同顯示出來
./test.sh > test2.log 2>&1
