重定向

UNIX 控制檯程式有一個輸入檔案和兩個輸出檔案(輸入和輸出流,以及裝置,被作業系統視為檔案。)這些通常分別是鍵盤和螢幕,但可以重定向它們中的任何一個或全部來自 - 或去 - 檔案或其他程式。

STDIN 是標準輸入,是程式接收互動輸入的方式。STDIN 通常被賦予檔案描述符 0。

STDOUT 是標準輸出。無論在 STDOUT 上發出什麼,都被認為是該計劃的結果STDOUT 通常被分配檔案描述符 1。

STDERR 是顯示錯誤訊息的地方。通常,當從控制檯執行程式時,STDERR 在螢幕上輸出,與 STDOUT 無法區分。STDERR 通常被分配檔案描述符 2。

重定向的順序很重要

command > file 2>&1

將(STDOUTSTDERR)重定向到檔案。

command 2>&1 > file

僅重定向 STDOUT,因為檔案描述符 2 被重定向到檔案描述符 1 指向的檔案(當評估語句時,它不是檔案 file)。

管道中的每個命令都有自己的 STDERR(和 STDOUT),因為每個命令都是一個新程序。如果你希望重定向影響整個管道,這可能會產生令人驚訝的結果。例如這個命令(包裝易讀性):

$ python -c 'import sys;print >> sys.stderr, "Python error!"' \
| cut -f1 2>> error.log

將列印“Python 錯誤!” 到控制檯而不是日誌檔案。而是將錯誤附加到要捕獲的命令:

$ python -c 'import sys;print >> sys.stderr, "Python error!"' 2>> error.log \
| cut -f1