8.2.3 重定向標準錯誤輸出
第5章介紹了標準輸出的概念,並解釋了如何重定向命令的標準輸出。除了標準輸出之外,命令還可以將輸出傳送到標準錯誤輸出。命令將錯誤訊息傳送到標準錯誤輸出,這樣就可以避免與傳送到標準輸出的資訊混淆在一起。
與處理標準輸出一樣,預設情況下,shell將命令的標準錯誤輸出傳送到螢幕上。除非重定向標準輸出和標準錯誤輸出中的某乙個,否則不能區分命令的輸出到底是標準輸出還是標準錯誤輸出。本節講述bourne again shell使用的語法。如果使用tc shell,請參見第9.3.4節。
檔案描述符 檔案描述符是程式傳送輸出和獲取輸入的地方。當執行乙個程式時,執行該程式的程序開啟了3個檔案描述符,分別是:0(標準輸入)、1(標準輸出)和2(標準錯誤輸出)。重定向輸出符號(>)是1>的簡寫,它通知shell重定向標準輸出。類似地,《是0《的簡寫,表示重定向標準輸入。符號2>將重定向標準錯誤輸出。參見第11.2節以獲取更多資訊。
下面的示例演示了如何將標準輸出和標準錯誤輸出重定向到不同的檔案和相同的檔案。當執行cat實用程式時,如果所帶引數中的某個檔案不存在,而另乙個檔案存在,那麼cat將傳送一條錯誤訊息到標準錯誤輸出,同時還將已存在的那個檔案複製乙份到標準輸出。除非重定向,否則兩條訊息都將出現在螢幕上。
$ cat yth-is -is y.
$ cat x
cat: x: no such file or directory
$ cat x ycat: x: no such file or directory
this is y.
將命令的標準輸出重定向時,傳送到標準錯誤輸出的輸出將不受影響,仍然出現在螢幕上。
$ cat x y > holdcat: x: no such file or directory
$ cat hold
this is y.
類似地,當使用管道傳送標準輸出時,標準錯誤輸出也不會受到影響。下面的示例將cat的標準輸出通過管道傳送給tr(在本例中,這個程式將小寫字母轉換為大寫字母)。cat傳送到標準錯誤輸出的文字並沒有轉換,這是因為它直接傳送到螢幕,並沒有經過這個管道。
$ cat x y | tr "[a-z]" "[a-z]"cat: x: no such file or directory
this is y.
下面的示例將標準輸出和標準錯誤輸出重定向到不同的檔案中。符號2>告訴shell將標準錯誤輸出(檔案描述符為2)重定向到的具體位置。1>告訴shell將標準輸出(檔案描述符為1)重定向到的具體位置。可以使用》代替1>。
$ cat x y 1> holdl 2> ho1d2$ cat holdl
this "is y.
$ cat ho1d2
cat: x: no such file or directory
複製檔案描述符 在下乙個示例中,1>將標準輸出重定向到檔案hold。然後,2>&1宣告檔案描述符2為檔案描述符1的副本。這樣做的結果是,標準輸出和標準錯誤輸出均被重定向到檔案hold中。
$ cat x y 1> hold 2>&1$ cat hold
cat: x: no such file or directory
this is y.
在這個示例中,1>hold放在了2>&1的前面。如果將它們的順序顛倒的話,在標準輸出重定向到檔案hold之前,標準錯誤輸出就已經複製了標準輸出的乙個副本。這樣一來,就只有標準輸出被重定向到檔案hold。
在下面的示例中,檔案描述符2是檔案描述符1的副本,通過乙個到tr命令的管道將輸出傳送到檔案描述符1。
$ cat x y 2>&1 | tr "[a-z]" "[a-z]"cat: x: no such file or directory
this is y.
傳送錯誤到標準錯誤輸出 還可以使用1>&2將命令的標準輸出重定向到標準錯誤輸出。shell指令碼中經常使用這項技術將echo的輸出傳送到標準錯誤輸出。在下面的指令碼中,第1個echo命令的標準輸出被重定向到標準錯誤輸出:
$ cat message_demoecho this is an error message. 1>&2
echo this is not an error message.
如果重定向message_demo的標準輸出,那麼像第1條echo命令產生的那些錯誤訊息將列印到螢幕,這是因為還沒有重定向標準錯誤輸出。因為shell指令碼的標準輸出經常被重定向到另乙個檔案,所以可以使用這項技術顯示指令碼產生的錯誤訊息。lnks指令碼就使用了這項技術。在指令碼中,還可以使用內建命令exec建立另外的檔案描述符,並重定向shell指令碼的標準輸入、標準輸出和標準錯誤輸出。
bourne again shell所支援的重定向操作符如表8-2所示。
表8-2 重定向操作符
操 作 符
含 義
將標準輸入重定向為檔案filename
>filename
除非檔案filename已存在並且設定了noclobber標記,否則標準輸出將被重定向到檔案filename;如果檔案filename不存在且沒有設定noclobber標記,那麼重定向操作將建立該檔案
>|filename
即使檔案filename存在且設定了noclobber標記,仍將標準輸出重定向到該檔案
>>filename
除非檔案filename已存在並且設定了noclobber標記,否則標準輸出將被重定向到檔案filename,並將內容新增到原檔案的末尾;如果沒有設定noclobber標記,並且檔案filename不存在,那麼將建立該檔案
<&m
從檔案描述符m複製標準輸入
[n]>&m
從檔案描述符m複製標準輸出或者檔案描述符n(如果命令中指定了n)
[n]<&-
關閉標準輸入或者檔案描述符n(如果指定了n)
[n]>&-
關閉標準輸出或者檔案描述符n(如果指定了n)
ls -lr /data > mylist1 > mylist2 2>&1
重定向標準錯誤輸出
第5章介紹了標準輸出的概念,並解釋了如何重定向命令的標準輸出。除了標準輸出之外,命令還可以將輸出傳送到標準錯誤輸出。命令將錯誤訊息傳送到標準錯誤輸出,這樣就可以避免與傳送到標準輸出的資訊混淆在一起。與處理標準輸出一樣,預設情況下,shell將命令的標準錯誤輸出傳送到螢幕上。除非重定向標準輸出和標準錯...
標準輸出 標準錯誤重定向(格式)
command filename 把把標準輸出重定向到乙個新檔案中 command filename 把把標準輸出重定向到乙個檔案中 追加 command 1 fielname 把把標準輸出重定向到乙個檔案中 command filename 2 1 把把標準輸出和標準錯誤一起重定向到乙個檔案中 c...
重定向 標準輸出 和 錯誤輸出
ls zxl l l linglonghome ls zxl no such file or directory ls l l no such file or directory linglonghome ls zxl l l linglonghome 1 dev null ls zxl no su...