在Linux下,當一個用戶進程被創建的時候,系統會自動為該進程創建三個數據
流,也就是題目中所提到的這三個。那么什么是數據流呢(stream)?
我們知道,一個程序要運行,需要有輸入、輸出,如果出錯,還要能表現出自身的錯誤。這是就要從某個地方讀入數據、將數據輸出到某個地方,這就夠成了數據流。
執行一個shell命令行時通常會自動打開三個標准文件,即標准輸入文件(stdin),通常對應終端的鍵盤;標准輸出文件(stdout)和標准錯誤輸出文件(stderr),這兩個文件都對應終端的屏幕。進程將從標准輸入文件中得到輸入數據,將正常輸出數據輸出到標准輸出文件,而將錯誤信息送到標准錯誤文件中。
[root@localhost ~]# cat config
將會把文件config的內容依次顯示到屏幕上。但是,如果cat的命令行中沒有參數,它就會從標准輸入中讀取數據,並將其送到標准輸出。例如:
[root@localhost ~]# cat Hello world Hello world Bye Bye
PS:ctrl-d快捷,標准輸入接收到EOF(結束)標識符
輸入重定向
[root@localhost ~]# wc
wc將等待用戶告訴它統計什么,這時shell就好象死了一樣,從鍵盤鍵入的所有文本都出現在屏幕上,但並沒有什么結果,直至按下ctrl+d,wc才將命令結果寫在屏幕上。
[root@localhost ~]# wc /etc/passwd 24 30 1061 /etc/passwd
另一種把/etc/passwd文件內容傳給wc命令的方法是重定向wc的輸入。
[root@localhost ~]# wc < /etc/passwd
24 30 1061
輸出重定向
[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目錄下的文件個數。
1、使用"2>&1" 把標准錯誤stderr重定向到標准輸出stdout;
2、使用"&>"把標准錯誤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命令的參數,結果仍然是停留在當前目錄下
