標(biāo)準(zhǔn)輸入,輸出,和錯(cuò)誤到目前為止,我們用到的許多程序都會(huì)產(chǎn)生某種輸出。這種輸出,經(jīng)常由兩種類型組成。 第一,程序運(yùn)行結(jié)果;這是說,程序要完成的功能。第二,我們得到狀態(tài)和錯(cuò)誤信息, 這些告訴我們程序進(jìn)展。如果我們觀察一個(gè)命令,像 ls,會(huì)看到它的運(yùn)行結(jié)果和錯(cuò)誤信息 顯示在屏幕上。與 Unix 主題“任何東西都是一個(gè)文件”保持一致,程序,比方說 ls,實(shí)際上把他們的運(yùn)行結(jié)果 輸送到一個(gè)叫做標(biāo)準(zhǔn)輸出的特殊文件(經(jīng)常用 stdout 表示),而它們的狀態(tài)信息則送到另一個(gè) 叫做標(biāo)準(zhǔn)錯(cuò)誤的文件(stderr)。默認(rèn)情況下,標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤都連接到屏幕,而不是 保存到磁盤文件。除此之外,許多程序從一個(gè)叫做標(biāo)準(zhǔn)輸入(stdin)的設(shè)備得到輸入,默認(rèn)情況下, 標(biāo)準(zhǔn)輸入連接到鍵盤。I/O 重定向允許我們可以更改輸出走向和輸入來向。一般地,輸出送到屏幕,輸入來自鍵盤, 但是通過I/O 重定向,我們可以改變輸入輸出方向。
2.標(biāo)準(zhǔn)輸出
使用 ” > ” 進(jìn)行標(biāo)準(zhǔn)的輸出,將命令的結(jié)果輸出到一個(gè)文件中, 但是這個(gè)重定向符進(jìn)行輸出將會(huì)將原文件中的內(nèi)容清除 ,并且如果 命令的輸出不是標(biāo)準(zhǔn)輸出,而是產(chǎn)生了錯(cuò)誤信息,這個(gè)錯(cuò)誤信息不會(huì)輸入到文件中,而是顯示在屏幕上.
如果想在進(jìn)行標(biāo)準(zhǔn)輸出的時(shí)候不是將文件重寫,而是在文件內(nèi)容的后面添加,就是用>> 重定向符
上面提到 使用上面的重定向符不能將錯(cuò)誤信息輸出到文件,可以使用shell提供的一種表示方式,shell內(nèi)部為標(biāo)準(zhǔn)輸入,標(biāo)準(zhǔn)輸出和錯(cuò)誤的文件描述符為0,1,2, 使用文件描述符來重定向錯(cuò)誤信息
ls -l /bin/usr 2> ls-error.txt
要想將標(biāo)準(zhǔn)輸出和錯(cuò)誤信息都輸出到一個(gè)文件,在bash中提供了兩種方法,這里主要介紹第二種新的方法.
ls -l /bin/usr &> ls-output.txt
處理不需要的輸出
有時(shí)候,不想要一個(gè)命令的輸出結(jié)果,想把他們?nèi)拥?,系統(tǒng)提供了一個(gè)方法,將信息重定向到一個(gè)特殊的叫做 “/dev/null” 的文件,這個(gè)是個(gè)系統(tǒng)設(shè)備,叫做位存儲(chǔ)桶,可以接受輸入,并且對(duì)輸入不做任何處理.為了隱瞞命令錯(cuò)誤信息可以這么做:
ls -l /bin/usr 2> /dev/null
3.標(biāo)準(zhǔn)輸入
3.1cat 連接文件
cat [file] //顯示文件的內(nèi)容,一般用來顯示簡(jiǎn)短的文本文件
cat可以接受不止一個(gè)文件作為參數(shù),將這些文件的內(nèi)容連接起來
cat movie*.txt > movie.txt //將多個(gè)文件內(nèi)容鏈接起來,重新定向到另一個(gè)文件,通配符總是按照有序的循序展開,所以會(huì)按照循序正確安排.
如果cat 沒有給出任何參數(shù),它會(huì)從標(biāo)準(zhǔn)輸入讀入數(shù)據(jù),因?yàn)闃?biāo)準(zhǔn)輸入,默認(rèn)情況下,連接到鍵盤。它正在等待我們輸入數(shù)據(jù)! 使用Ctrl + d 告訴cat 在標(biāo)準(zhǔn)輸入中已經(jīng)到了結(jié)尾.
可以用這個(gè)來創(chuàng)建個(gè)簡(jiǎn)單的文本文件
cat > a.txt // 回車
i am a boy.//這一行輸入想要輸入的內(nèi)容,然后使用ctrl + d 告訴cat到了標(biāo)準(zhǔn)輸入的結(jié)尾
cat < a.txt //使用< 重定向符將標(biāo)準(zhǔn)輸入源從鍵盤改到文件a.txt,結(jié)果和使用只文件名一樣,
4.管道線
使用管道操作符 “|” ,一個(gè)命令的標(biāo)準(zhǔn)輸出可以管道到另一個(gè)命令的表追輸入.
command1 | command2
如:
ls -l /usr/bin | less
過濾器
幾個(gè)命令放在一起組成一個(gè)管道線,通常,以這種方式使用的命令被稱為過濾器