重定向stdin stdout stderr |

Linux下,當一個用戶進程被建立的時候,系統會自動爲該進程建立三個數據linux

流,也就是題目中所提到的這三個。那麼什麼是數據流呢(stream)?shell

咱們知道,一個程序要運行,須要有輸入、輸出,若是出錯,還要能表現出自身的錯誤。這是就要從某個地方讀入數據、將數據輸出到某個地方,這就夠成了數據流。編輯器

執行一個shell命令行時一般會自動打開三個標準文件,即標準輸入文件(stdin),一般對應終端的鍵盤;標準輸出文件(stdout)和標準錯誤輸出文件(stderr),這兩個文件都對應終端的屏幕。進程將從標準輸入文件中獲得輸入數據,將正常輸出數據輸出到標準輸出文件,而將錯誤信息送到標準錯誤文件中。spa

 

以cat命令爲例,cat命令的功能是從命令行給出的文件中讀取數據,並將這些數據直接送到標準輸出。若使用以下命令:
[root@localhost ~]# cat config

將會把文件config的內容依次顯示到屏幕上。可是,若是cat的命令行中沒有參數,它就會從標準輸入中讀取數據,並將其送到標準輸出。例如:.net

[root@localhost ~]# cat
Hello world
Hello world
Bye
Bye

PS:ctrl-d快捷,標準輸入接收到EOF(結束)標識符命令行

用戶輸入的每一行都馬上被cat命令輸出到屏幕上。
 
直接使用標準輸入/輸出文件存在如下問題:
輸入數據從終端輸入時,用戶費了半天勁輸入的數據只能用一次。下次再想用這些數據時就得從新輸入。並且在終端上輸入時,若輸入有誤修改起來不是很方便。
輸出到終端屏幕上的信息只能看不能動。沒法對此輸出做更多處理,如將輸出做爲另外一命令的輸入進行進一步的處理等。
爲了解決上述問題,Linux系統爲輸入、輸出的傳送引入了另外兩種機制,即輸入/輸出重定向和管道

輸入重定向

輸入重定向是指把命令(或可執行程序)的標準輸入重定向到指定的文件中。也就是說,輸入能夠不來自鍵盤,而來自一個指定的文件。因此說,輸入重定向主要用於改變一個命令的輸入源,特別是改變那些須要大量輸入的輸入源。
 
例如,命令wc統計指定文件包含的行數、單詞數和字符數數。若是僅在命令行上鍵入:
[root@localhost ~]# wc

wc將等待用戶告訴它統計什麼,這時shell就好象死了同樣,從鍵盤鍵入的全部文本都出如今屏幕上,但並無什麼結果,直至按下ctrl+d,wc纔將命令結果寫在屏幕上。code

若是給出一個文件名做爲wc命令的參數,以下例所示,wc將返回該文件所包含的行數、單詞數和字符數
[root@localhost ~]# wc /etc/passwd
24 30 1061 /etc/passwd

 另外一種把/etc/passwd文件內容傳給wc命令的方法是重定向wc的輸入。blog

 輸入重定向的通常形式爲命令<文件名。能夠用下面的命令把wc命令的輸入重定向爲/etc/passwd文件:

[root@localhost ~]# wc < /etc/passwd
24 30 1061進程

 

輸出重定向get

 
輸出重定向是指把命令(或可執行程序)的標準輸出或標準錯誤輸出從新定向到指定文件中。這樣,該命令的輸出就不顯示在屏幕上,而是寫入到指定文件中。
輸出重定向比輸入重定向更經常使用,不少狀況下均可以使用這種功能。例如,若是某個命令的輸出不少,在屏幕上不能徹底顯示,那麼將輸出重定向到一個文件中,而後再用文本編輯器打開這個文件,就能夠查看輸出信息;若是想保存一個命令的輸出,也可使用這種方法。還有,輸出重定向能夠用於把一個命令的輸出看成另外一個命令的輸入(還有一種更簡單的方法,就是使用管道,將在下面介紹)。
輸出重定向的通常形式爲:命令>文件名。例如:
[root@localhost ~]# ls > directory.out
將ls命令的輸出保存爲一個名爲directory.out的文件。
注:若是>符號後邊的文件已存在,那麼這個文件將被重寫。
爲避免輸出重定向中指定文件只能存放當前命令的輸出重定向的內容,shell提供了輸出重定向的一種追加手段。輸出追加劇定向與輸出重定向的功能很是類似,區別僅在於輸出追加劇定向的功能是把命令(或可執行程序)的輸出結果追加到指定文件的最後,而該文件原有內容不被破壞。
 
若是要將一條命令的輸出結果追加到指定文件的後面,可使用追加劇定向操做符>>。形式爲:命令>>文件名。例如:
[root@localhost ~]# ls *.doc>>directory.out
[root@localhost ~]# cat directory.out
 ch1.doc ch2.doc ch3.doc chimp config mail/ test/
   ch1.doc ch2.doc ch3.doc

 

和程序的標準輸出重定向同樣,程序的錯誤輸出也能夠從新定向。使用符號2>(或追加符號2>>)表示對錯誤輸出設備重定向。例以下面的命令:

[root@localhost ~]# ls /usr/tmp 2> err.file

可在屏幕上看到程序的正常輸出結果,但又將程序的任何錯誤信息送到文件err.file中,以備未來檢查用

還可使用另外一個輸出重定向操做符(&>)將標準輸出和錯誤輸出同時送到同一文件中。例如:
[root@localhost ~]# ls /usr/tmp &> output.file

利用重定向將命令組合在一塊兒,可實現系統單個命令不能提供的新功能。例如使用下面的命令序列:

[root@localhost ~]#  ls /usr/bin > /tmp/dir
[root@localhost ~]# wc -w < /tmp/dir
615

統計了/usr/bin目錄下的文件個數。

 

一、使用"2>&1" 把標準錯誤stderr重定向到標準輸出stdout;
二、使用"&>"把標準錯誤stderr重定向到標準輸出stdout;

 

管 道

將一個程序或命令的輸出做爲另外一個程序或命令的輸入,有兩種方法,一種是經過一個臨時文件將兩個命令或程序結合在一塊兒,例如上個例子中的/tmp/dir文件將ls和wc命令聯在一塊兒;另外一種是Linux所提供的管道功能。這種方法比前一種方法更好。
管道能夠把一系列命令鏈接起來,這意味着第一個命令的輸出會做爲第二個命令的輸入經過管道傳給第二個命令,第二個命令的輸出又會做爲第三個命令的輸入,以此類推。顯示在屏幕上的是管道行中最後一個命令的輸出(若是命令行中未使用輸出重定向)。
經過使用管道符「|」來創建一個管道行。用管道重寫上面的例子:
[root@localhost ~]#  ls /usr/bin|wc -w
615

再如:

[root@localhost ~]# cat sample.txt|grep "High"|wc -l

管道將cat命令(列出一個文件的內容)的輸出送給grep命令。grep命令在輸入裏查找單詞High,grep命令的輸出則是全部包含單詞High的行,這個輸出又被送給wc命令,wc命令統計出輸入中的行數。假設sample.txt文件的內容以下:

Things to do today:
Low:Go grocery shopping
High:Return movie
High:Clear level 3 in Alien vs. Predator
Medium:Pick up clothes from dry cleaner
那麼該管道行的結果是2。

命令替換

命令替換和重定向有些類似,但區別在於命令替換是將一個命令的輸出做爲另一個命令的參數。經常使用命令格式爲:
command1 `command2`
其中,command2的輸出將做爲command1的參數。須要注意的是這裏的`符號,被它括起來的內容將做爲命令執行,執行後的結果做爲command1的參數。例如:

[root@localhost ~]# cd `pwd`

該命令將pwd命令列出的目錄做爲cd命令的參數,結果仍然是停留在當前目錄下

相關文章
相關標籤/搜索