shell入門第十講
1、Linux標準流
在Linux中,?標準輸入?是標準輸入流,這接受文本作為其輸入,我們看到的stdin就是標準輸入流之意(也稱為輸入重定向)。從命令到shell的文本輸出是通過?標準輸出?(標準輸出)流,stdout就是標準輸出流之意(也稱為輸出重定向),來自命令的錯誤消息通過發(fā)送?標準錯誤?(標準錯誤)流,比如stderr就是標準錯誤流之意(也稱為錯誤重定向)。
我們之前給大家介紹過,一個命令不管執(zhí)行成功與否,都會產(chǎn)生一個狀態(tài)值,這個值如果是0,就表示命令執(zhí)行成功了,如果是1~255之間的任意一個數(shù)字,均表示執(zhí)行失敗。
那么在Linux標準流中,stdout和stderr也同樣如此。如果我們使用了Linux標準流的功能,當我們執(zhí)行一個命令成功后,那么終端打印的信息也將會被傳送至stdout中。當我們執(zhí)行命令失敗后,那么終端打印的報錯信息也將會被傳送至stderr中。
1.1、stdout
輸出重定向我們一般使用?>來表示,比如將信息輸出重定向到一個文件中。
舉一個例子來說明一下:
bash [root@master1 ~]#echo "this is a information" this is a information [root@master1 ~]#echo $? 0 [root@master1 ~]#echo "this is a information" > c.txt [root@master1 ~]#cat c.txt this is a information
當我們使用echo來打印一段信息的時候,我們通過$?判斷出來這是執(zhí)行成功的,因此我使用stdout將正確的信息傳給c.txt這個文件中。c.txt我可以不必提前創(chuàng)建,重定向輸出stdout會自動幫我們建立好一個文件并且將打印信息寫入這個文件中。
1.2、stderr
錯誤重定向我們一般使用?2>?來表示,比如將錯誤信息重定向到一個文件中。比如:
bash [root@master1 ~]#ls #我ls查看剛剛的c.txt這個文件 c.txt [root@master1 ~]#catt c.txt #我想查看內(nèi)容時不小心把cat命令寫錯了, bash: catt: 未找到命令… #然后就報錯了。 相似命令是: 'cat' [root@master1 ~]#catt c.txt 2> d.txt #將報錯信息寫入其他的文件d.txt中。 [root@master1 ~]#cat d.txt bash: catt: 未找到命令… 相似命令是: 'cat' [root@master1 ~]#
我不小心把cat命令寫錯了catt命令,那么肯定是執(zhí)行失敗的,畢竟Linux操作系統(tǒng)里面沒有catt這個命令,所以shell就返回給我們錯誤信息了。
1.3、stdin
輸入重定向stdin,我們一般使用?<這個符號來表示,比如: bash [root@master1 ~]#cat c.txt this is a information [root@master1 ~]#wc -l < c.txt 1 將c.txt文件內(nèi)容通過標準輸入重定向到wc命令中,隨后我們可以統(tǒng)計出c.txt文件的行數(shù)。 不過 stdin一般用于鍵盤輸入字符,下面我們會講。 1.4、追加信息輸出重定向 我們上面的stdout和stderr只是將信息輸出到一個文件中,如果再次重定向輸出的話,文件之前的內(nèi)容將會被覆蓋掉,只會寫入最新的內(nèi)容到文件中,比如: bash [root@master1 ~]#cat c.txt this is a information [root@master1 ~]#echo "this is two information" > c.txt [root@master1 ~]#cat c.txt this is two information
你會發(fā)現(xiàn)重定向只是把最新的內(nèi)容寫到文件中了,文件之前的內(nèi)容會被覆蓋,因此我們需要追加重定向,也就是說新的內(nèi)容會接著之前寫入的文件內(nèi)容繼續(xù)添加,比如:
bash [root@master1 ~]#echo "this is three information" >> c.txt [root@master1 ~]#cat c.txt this is two information this is three information
錯誤重定向也是如此,如果只是使用2>同樣也會清空舊信息,把新內(nèi)容現(xiàn)在寫進去,因此追加錯誤信息使用2>>即可,比如:
bash [root@master1 ~]#cat d.txt bash: catt: 未找到命令… 相似命令是: 'cat' [root@master1 ~]#catt c.txt 2>> d.txt ##命令再次使用錯誤 [root@master1 ~]#cat d.txt bash: catt: 未找到命令… 相似命令是: 'cat' bash: catt: 未找到命令… ## 這是新的錯誤信息 相似命令是: 'cat'
1.5、同時進行標準輸出和錯誤輸出至文件
在企業(yè)中往往是這么干的,寫一個腳本,包含很多命令,那么我們需要將打印服務信息的命令寫上stdout和stderr,因為日志文件有助于我們排查問題所在,比如:
bash [root@master1 ~]#cat c.txt >> f.txt 2>> h.txt [root@master1 ~]#cattt c.txt >> f.txt 2>> h.txt [root@master1 ~]#cat f.txt this is two information this is three information [root@master1 ~]#cat h.txt bash: cattt: 未找到命令… [root@master1 ~]#
正如命令第一、二行所示,我們寫上一個命令時,把stdout信息寫入一個文件f.txt中,stderr信息寫入錯誤日志文件h.txt中。當執(zhí)行成功的命令便會把正確信息輸出到文件中,錯誤的信息輸出到其他的文件中,方便我們排查問題所在。
當然,把標準輸出stdout和錯誤輸出stderr到一個文件也是可以的,這個時候我們需要使用到符號?2> &1?或者是?&>>這兩種,比如:
bash [root@master1 ~]#cat c.txt &>> s.txt #這是正確輸出 [root@master1 ~]#cat s.txt this is two information this is three information [root@master1 ~]#catt c.txt &>> s.txt #這是錯誤輸出 [root@master1 ~]#cat s.txt this is two information this is three information bash: catt: 未找到命令… 相似命令是: 'cat' [root@master1 ~]#
或者是
bash [root@master1 ~]#cat c.txt >> x.txt 2>&1 #這是正確輸出 [root@master1 ~]#catt c.txt >> x.txt 2>&1 #這是錯誤輸出 [root@master1 ~]#cat x.txt this is two information this is three information bash: catt: 未找到命令… 相似命令是: 'cat'
可以看到正確輸出的內(nèi)容和錯誤輸出的內(nèi)容都是以追加的方式寫入一個文件中的,符合我們的預期。
當然你也可以寫入Linux的無底洞/dev/null,也就是不管命令執(zhí)行成功與否,都不要給我們打印任何信息。比如
bash [root@master1 ~]#ls /tmp &> /dev/null
1.6、幾個符號的意思
那么說到這里,我跟你說幾個符號及可能就看明白了,但是你可能有疑惑,為什么錯誤輸出是使用數(shù)字2呢?因為這是Linux本身設計的,記住就行,除此之外,0和1是可以省略的,比如>和1>是一樣的,但是2表示stderr卻不能省略,必須要加上才行。
bash /dev/null 表示空設備文件 0 表示stdin標準輸入 1 表示stdout標準輸出 2 表示stderr標準錯誤
記住上面幾個符號的意思,因為工作中會經(jīng)常使用。
聲明:文章來源于網(wǎng)絡,如有侵權請聯(lián)系刪除!