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