1、首先,bash中0,1,2三個(gè)數(shù)字分別代表STDIN_FILENO、STDOUT_FILENO、STDERR_FILENO,即標(biāo)準(zhǔn)輸入(一般是鍵盤),標(biāo)準(zhǔn)輸出(一般是顯示屏,準(zhǔn)確的說(shuō)是用戶終端控制臺(tái)),標(biāo)準(zhǔn)錯(cuò)誤(出錯(cuò)信息輸出)。
2、輸入輸出可以重定向,所謂重定向輸入就是在命令中指定具體的輸入來(lái)源,譬如 cat < test.c 將test.c重定向?yàn)閏at命令的輸入源。輸出重定向是指定具體的輸出目標(biāo)以替換默認(rèn)的標(biāo)準(zhǔn)輸出,譬如ls > 1.txt將ls的結(jié)果從標(biāo)準(zhǔn)輸出重定向?yàn)?.txt文本。有時(shí)候會(huì)看到如 ls >> 1.txt這類的寫法,> 和 >> 的區(qū)別在于:> 用于新建而>>用于追加。即ls > 1.txt會(huì)新建一個(gè)1.txt文件并且將ls的內(nèi)容輸出到新建的1.txt中,而ls >> 1.txt則用在1.txt已經(jīng)存在,而我們只是想將ls的內(nèi)容追加到1.txt文本中的時(shí)候。
3、默認(rèn)輸入只有一個(gè)(0,STDIN_FILENO),而默認(rèn)輸出有兩個(gè)(標(biāo)準(zhǔn)輸出1 STDOUT_FILENO,標(biāo)準(zhǔn)錯(cuò)誤2 STDERR_FILENO)。因此默認(rèn)情況下,shell輸出的錯(cuò)誤信息會(huì)被輸出到2,而普通輸出信息會(huì)輸出到1。但是某些情況下,我們希望在一個(gè)終端下看到所有的信息(包括標(biāo)準(zhǔn)輸出信息和錯(cuò)誤信息),要怎么辦呢?
對(duì)了,你可以使用我們上面講到的輸出重定向。思路有了,怎么寫呢? 非常直觀的想法就是2>1(將2重定向到1嘛),行不行呢?試一試就知道了。我們進(jìn)行以下測(cè)試步驟:
1)mkdir test && cd test ; 創(chuàng)建test文件夾并進(jìn)入test目錄
2)touch a.txt b.c c ; 創(chuàng)建a.txt b.c c 三個(gè)文件
3)ls > 1 ; 按我們的猜測(cè),這句應(yīng)該是將ls的結(jié)果重定向到標(biāo)準(zhǔn)輸出,因此效果和直接ls應(yīng)該一樣。但是實(shí)際這句執(zhí)行后,標(biāo)準(zhǔn)輸出中并沒有任何信息。
4)ls ; 執(zhí)行3之后再次ls,則會(huì)看到test文件夾中多了一個(gè)文件1
5)cat 1 ; 查看文件1的內(nèi)容,實(shí)際結(jié)果為:1 a.txt b.c c 可見步驟3中 ls > 1并不是將ls的結(jié)果重定向?yàn)闃?biāo)準(zhǔn)輸出,而是將結(jié)果重定向到了一個(gè)文件1中。即1在此處不被解釋為STDOUT_FILENO,而是文件1。
4、到了此時(shí),你應(yīng)該也能猜到2>&1的用意了。不錯(cuò),2>&1就是用來(lái)將標(biāo)準(zhǔn)錯(cuò)誤2重定向到標(biāo)準(zhǔn)輸出1中的。此處1前面的&就是為了讓bash將1解釋成標(biāo)準(zhǔn)輸出而不是文件1。至于最后一個(gè)&,則是讓bash在后臺(tái)執(zhí)行。