在Linux下,當一個用戶進程被建立的時候,系統會自動爲該進程建立三個數據linux
流,也就是題目中所提到的這三個。那麼什麼是數據流呢(stream)?shell
咱們知道,一個程序要運行,須要有輸入、輸出,若是出錯,還要能表現出自身的錯誤。這是就要從某個地方讀入數據、將數據輸出到某個地方,這就夠成了數據流。編輯器
執行一個shell命令行時一般會自動打開三個標準文件,即標準輸入文件(stdin),一般對應終端的鍵盤;標準輸出文件(stdout)和標準錯誤輸出文件(stderr),這兩個文件都對應終端的屏幕。進程將從標準輸入文件中獲得輸入數據,將正常輸出數據輸出到標準輸出文件,而將錯誤信息送到標準錯誤文件中。spa
[root@localhost ~]# cat config
將會把文件config的內容依次顯示到屏幕上。可是,若是cat的命令行中沒有參數,它就會從標準輸入中讀取數據,並將其送到標準輸出。例如:.net
[root@localhost ~]# cat Hello world Hello world Bye Bye
PS:ctrl-d快捷,標準輸入接收到EOF(結束)標識符命令行
[root@localhost ~]# wc
wc將等待用戶告訴它統計什麼,這時shell就好象死了同樣,從鍵盤鍵入的全部文本都出如今屏幕上,但並無什麼結果,直至按下ctrl+d,wc纔將命令結果寫在屏幕上。code
[root@localhost ~]# wc /etc/passwd 24 30 1061 /etc/passwd
另外一種把/etc/passwd文件內容傳給wc命令的方法是重定向wc的輸入。blog
[root@localhost ~]# wc < /etc/passwd
24 30 1061進程
輸出重定向get
[root@localhost ~]# ls > directory.out
[root@localhost ~]# ls *.doc>>directory.out
[root@localhost ~]# cat directory.out
ch1.doc ch2.doc ch3.doc chimp config mail/ test/
和程序的標準輸出重定向同樣,程序的錯誤輸出也能夠從新定向。使用符號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;
[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文件的內容以下:
[root@localhost ~]# cd `pwd`
該命令將pwd命令列出的目錄做爲cd命令的參數,結果仍然是停留在當前目錄下