7.標準輸入/輸出/錯誤 及I/O轉向 與 管線

系統一開始預設開啟三個檔案:標準輸入(檔案代碼為 0),通常連結到鍵盤;標準輸出(檔案代碼為 1),通常為螢幕;標準錯誤(檔案代碼為 2),通常也是螢幕。

不過,這些預設的連結是可以改變的,這就是 I/O 轉向的觀念。

比如:echo "Hello world" 原是顯示在螢幕上的,但 echo "Hello world" > test,就可將 "Hello world" 這字串轉向存到 text 中。此 > 即表示輸出轉向,它會開啟一個新檔,若該檔原就存在,則會先被清空。

若不想 test 被清空,可使用 echo "Hello world" >> test,它可以將 "Hello world" 這字串轉向附加到 text 中。此 >> 即表示輸出轉向附加,它會把轉向的內容附加在該檔之後。

cat < test 即是輸入轉向,原應是由鍵盤輸入的,現在則由 test 這個檔案來提供。

假設檔名 z開頭的檔案不存在,則 ls z* 將會出現錯誤訊息:

ls: z*: 沒有此一目錄或檔案

我們可以將此錯誤訊息轉向,而存放在 error.msg: ls z* 2> error.msg

另外,我們經常會將標準錯誤伴隨標準輸出予以轉向,使執行過程不會產生任何訊息:

如:/usr/sbin/ntpdate stdtime.sinica.edu.tw 2>&1 > /dev/null

上述指令的意思是說:把執行過程可能產生的錯誤訊息伴隨著標準輸出(執行後的訊息),都轉向到垃圾桶 /dev/null 中,使之消失不見!

註:在轉向符號 > 之後若接的不是檔名,而是檔案代碼(如標準輸入的檔案代碼為 1),則需使用 >& 的寫法

在 Un*x 系統中,經常會利用幾個小工具,互相搭配,以完成一件工作,這種觀念稱為管線(Pipeline)

比如: date | cut -d' ' -f3 就是把 date 的輸出,變成 cut 的輸入,藉由二者的合作,完成一件工作。這在 shell script 中經常可見。

本節習題

  1. test 為一文字檔,試問以下二者有何不同?

    cat < test

    cat test