重定向
UNIX 控制檯程式有一個輸入檔案和兩個輸出檔案(輸入和輸出流,以及裝置,被作業系統視為檔案。)這些通常分別是鍵盤和螢幕,但可以重定向它們中的任何一個或全部來自 - 或去 - 檔案或其他程式。
STDIN
是標準輸入,是程式接收互動輸入的方式。STDIN
通常被賦予檔案描述符 0。
STDOUT
是標準輸出。無論在 STDOUT
上發出什麼,都被認為是該計劃的結果。STDOUT
通常被分配檔案描述符 1。
STDERR
是顯示錯誤訊息的地方。通常,當從控制檯執行程式時,STDERR
在螢幕上輸出,與 STDOUT
無法區分。STDERR
通常被分配檔案描述符 2。
重定向的順序很重要
command > file 2>&1
將(STDOUT
和 STDERR
)重定向到檔案。
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