其實要弄清楚 2>&1 的含義,首先應當知道linux中有三種標准輸入輸出,分別是STDIN,STDOUT,STDERR,對應的數字是0,1,2。STDIN就是標准輸入,默認從鍵盤讀取信息;STDOUT是標准輸出,默認將輸出結果輸出至終端,也就是顯示器之類的東西;STDERR是標准的錯誤信息,默認也會顯示在終端上。由於STDOUT與STDERR都會默認顯示在終端上,為了區分二者的信息,就有了編號的0,1,2的定義,用1表示STDOUT,2表示STDERR。
下面舉個例子:以rhce中的例子為例。
1、在系統中創建一個普通用戶test;
2、以普通用戶登錄,或者以root登錄 su -test 切換至普通用戶test;
3、執行 find /etc -name passwd 命令,默認會將命令的執行結果(STDOUT)與錯誤信息(STDERR)都輸出至終端顯示器。
4、體驗一下編號1,2的作用,find /etc -name passwd >find.out 2>find.err,這裡會將STDOUT與STDERR分別存放至find.out和find.err中,該命令也可以寫成下面三種形式,大家可以體會一下編號的意義。
find /etc -name passwd 1>find.out 2>find.err
find /etc -name passwd 2>find.err >find.out
find /etc -name passwd 2>find.err 1>find.out
我個人理解就是find /etc -name passwd的命令的執行結果輸出正確的輸出(STDOUT)被1接收,錯誤的信息(STDERR)被2接收。
5、若要將所有的輸出及錯誤信息都顯示出來,可以用&表示全部1和2的信息,例如:
find /etc -name passwd &>find.all
6、有時候希望將錯誤的信息重新定向到輸出,就是將2的結果重定向至1中就有了"2>1"這樣的思路,如果按照上面的寫法,系統會默認將錯誤的信息(STDERR)2重定向到一個名字為1的文件中,而非所想的(STDOUT)中。因此需要加&進行區分。就有了 2>&1 這樣的用法,舉例:
find /etc -name passwd 2>&1 |less
7、有時候還能看到這樣的用法:
find /etc -name passwd &2>&1 |less
這裡可以分解成
find /etc -name passwd & 表示前面的命令放到後台執行。
2>&1 |less 表示將錯誤信息重定向至標准輸出,並用less進行分頁顯示。