以上種種,都是程序所涉及的輸入與輸出常見途徑。就輸入而言,很多程序都從一個叫標準輸入的設備得到輸入信息,不難想到,這個設備就是我們的鍵盤,命令行下大多數操作都是通過鍵盤完成。而輸出分為兩種,標準輸出和標準錯誤,通常,這兩個輸出都會直接連接到屏幕,而不是保存到磁盤文件
以往,我們使用“ls -l /”,會將程序的結果輸出到屏幕上,現在,我們使用重定向,將這個結果保存到一個文件中。“ls -l / > /testls.txt”,使用“>”,把程序的輸出結果,從標準輸出(屏幕)重定向到指定的文件。
我們再嘗試一下重定向錯誤信息到testls.txt文件

文件之前保存的內容也不見了!之所以會這樣,是因為我們只指定了標準輸出的重定向,但是標準輸出因為錯誤而中斷了(目標文件不存在,所以壓根沒有輸出),所以標準輸出沒有任何內容。
*所以直接使用重定向符號“> something.txt”會直接創建一個空文件,或者清空同名文件的內容
重定向追加操作符“>>”
當我們把“ls -l / > /testls.txt”改為“ls -l / >> /testls.txt”,那么意味著,如果目標文件不存在,會新建一個目標文件,并將標準輸出輸出到該文件,如果存在,那么會將標準輸出追加到該文件的尾部。
重定向標準錯誤
為了能使用重定向錯誤,我們需要先知道,Linux在執行一個程序的時候會打開多個流,我們把前三個看做標準輸入,標準輸出,標準錯誤,他們在shell中有各自的文件描述符(可以理解為流編號),分別是0,1,2,當我們使用“>”重定向標準輸出時,我們實際上是重定向了文件描述符為1的流,也就是說
“ls . > a.txt”等同于”ls . 1> a.txt”
那么重定向標準錯誤也就是
“ls null 2> a.txt”
假定null是一個不存在的文件,命令執行之后,產生的錯誤信息會重定向到你指定的文件。
還可以使用“>&”(或者“&>”)來把標準輸出和標準錯誤都重定向到一個位置
“ls null >& a.txt”
這樣,兩種輸出信息都會寫到a.txt中。這是一種聯合的寫法,可以更具體去寫
“ls null > a.txt 2>&1“重定向標準輸出到a.txt文件,然后重定向標準錯誤到標準輸出。這里要注意順序,需要先重定向標準輸出,再重定向標準錯誤,如果順序反過來,那么標準錯誤會重定向到屏幕。
為了能更好的了解這些數字所對應輸入輸出的關系,我們進一步來說明一下。在Linux中,一切皆文件,設備也是如此,我們查看一下設備掛載點

其中我們看到,有stderr,stdin,stdout三個軟連接,他們分別指向了proc掛載點下的三個文件,在這里,我們其實已經能找到文件描述符和輸入輸出的對應關系,文件描述符0,1,2都指向了同一個設備/dev/pts/0,這個設備中前三個流我們使用文件描述符0,1,2來規定為標準輸入,輸出和錯誤。這里額外說一句,為什么文件描述符會指向/dev/pts/0這個設備呢,因為演示的時候是使用的裝有Xwindow圖形界面的Linux,我們是在使用一個叫終端控制臺的東西在和shell進行交互,在這種情況下,/dev/pts/n(n代表序號,0代表當前終端,1代表第一個,2代表第二個,以此類推)是在Xwindow模式下的偽終端。如果在純Shell環境下,我們使用的設備將不是/dev/pts/n,而是/dev/tty1。關于終端的更多信息,可以自行查閱。
Xwindow:

Shell:

重定向標準輸入
剛才我們使用了cat命令,cat命令的標準輸入是什么呢?之前我們指定了一個文件作為cat命令的標準輸入,倘若不指定文件呢?

我們發現命令行正在等待我們的輸入,是的,我們沒有指定文件作為cat的標準輸入,所以cat就查找默認的標準輸入:鍵盤,我們輸入一段字符,按下“ctrl+d”來通知cat已經完成寫入,按下回車,我們剛才鍵入的文字出現在了屏幕上。
好了,重定向的功能已經實現了,不是么,但是這里我們并沒有使用重定向符號”>”,對于cat命令,我們可以
cat < someText.txt 來重定向cat的標準輸入
*”<“和“>”,還有”>>”都可以重定向
Linux里的黑洞,神話中的貔貅,/dev/null文件
我想已經能夠很清楚的描述/dev/null的作用了,首先/dev/null是一個文件,通過文獻,也可以得知他叫“位存儲桶”,他能處理掉任何寫入他的信息,換言之,寫入后不作任何處理。如果我們重定向輸出到位存儲桶,那么他既不會存儲,也不會輸出,但是會提示寫入成功。用來處理異常信息是個不錯的選擇。
連接命令間的輸入與輸出,管道線
管道線,寫作“|”,對,很形象,作用也很形象,就是連接命令之間的輸入和輸出。
示例:
“ls -l / | cat”,加不加管道線聯合cat都會在屏幕上輸出,雖然在這里,管道線看上去沒什么作用,但是再看下面這個例子
“ps -ef|grep XXX”,簡而言之就是,找到我們所需的進程,ps命令執行之后會在屏幕上展示當前所有進程,通過管道線,將這個輸出作為grep命令的輸入,找到匹配我們給定字符的行并在屏幕上展示