一、首先,bash中0,1,2三個數字分別表明STDIN_FILENO、STDOUT_FILENO、STDERR_FILENO,即標準輸入(通常是鍵盤),標準輸出(通常是顯示屏,準確的說是用戶終端控制檯),標準錯誤(出錯信息輸出)。shell
二、輸入輸出能夠重定向,所謂重定向輸入就是在命令中指定具體的輸入來源,譬如 cat < test.c 將test.c重定向爲cat命令的輸入源。輸出重定向是指定具體的輸出目標以替換默認的標準輸出,譬如ls > 1.txt將ls的結果從標準輸出重定向爲1.txt文本。有時候會看到如 ls >> 1.txt這類的寫法,> 和 >> 的區別在於:> 用於新建而>>用於追加。即ls > 1.txt會新建一個1.txt文件而且將ls的內容輸出到新建的1.txt中,而ls >> 1.txt則用在1.txt已經存在,而咱們只是想將ls的內容追加到1.txt文本中的時候。
bash
三、默認輸入只有一個(0,STDIN_FILENO),而默認輸出有兩個(標準輸出1 STDOUT_FILENO,標準錯誤2 STDERR_FILENO)。所以默認狀況下,shell輸出的錯誤信息會被輸出到2,而普通輸出信息會輸出到1。可是某些狀況下,咱們但願在一個終端 下看到全部的信息(包括標準輸出信息和錯誤信息),要怎麼辦呢?測試
對了,你可使用咱們上面講到的輸出重定向。思路有了,怎麼寫呢? 很是直觀的想法就是2>1(將2重定向到1嘛),行不行呢?試一試就知道了。咱們進行如下測試步驟:test
1)mkdir test && cd test ; 建立test文件夾並進入test目錄後臺
2)touch a.txt b.c c ; 建立a.txt b.c c 三個文件終端
3)ls > 1 ; 按咱們的猜想,這句應該是將ls的結果重定向到標準輸出,所以效果和直接ls應該同樣。可是實際這句執行後,標準輸出中並無任何信息。重定向
4)ls ; 執行3以後再次ls,則會看到test文件夾中多了一個文件1touch
5)cat 1 ; 查看文件1的內容,實際結果爲:1 a.txt b.c c 可見步驟3中 ls > 1並非將ls的結果重定向爲標準輸出,而是將結果重定向到了一個文件1中。即1在此處不被解釋爲STDOUT_FILENO,而是文件1。di
四、到了此時,你應該也能猜到2>&1的用意了。不錯,2>&1就是用來將標準錯誤2重定向到標準輸出1中的。此處1前面的&就是爲了讓bash將1解釋成標準輸出而不是文件1。至於最後一個&,則是讓bash在後臺執行。文件