Bash
Stderr 重定向意外地重定向了一些 BASH 內置函式
我試圖對執行互動式 BASH 腳本的使用者隱藏所有標準錯誤,但將錯誤保留在日誌文件中。然而,簡單的 stderr 重定向出乎意料地隱藏了一些 BASH 輸出,而這些輸出應該轉到stdout。已經在兩個系統上嘗試過這個並得到了相同的結果(一個有GNU bash,版本 4.1.2(1)-release (x86_64-redhat-linux-gnu),另一個在 MacOS X 上)。
我有一個揮之不去的懷疑,它可能是由
exec
更換外殼引起的……但另一個內置 (times
) 按預期工作並輸出到stdout!一個例子:
#!/bin/bash exec 2>>file_log echo This will be printed to stdout, as expected ls ThereIsNoSuchFileOnEarth # this will go to “file_log”, as expected read –p 'User would never see this prompt and it would go to file_log. Totally unexpected.' –r -e test species=”Daleks Raxacoricofallapatorians Judoon” select enemy in $species; do # …code omitted as the user would never see the list. It would go into file_log again! done
來自
read
和的提示select
應該轉到標準錯誤,因為它們可能是使用者互動的提示,而不是實際的輸出。這使您可以執行tool.sh > tool.out
並仍然使用read
並select
從使用者那裡收集資訊,而不會“污染”實際輸出。標準輸出是程序的典型輸出,理想情況下,它可以通過管道傳輸到另一個程序的標準輸入中,既不麻煩也不麻煩。
這也是為什麼
curl
,例如,在標準錯誤而不是標準輸出上顯示其下載進度;您可以curl http://www.example.com/path/to/file > file
並且僅file
顯示 的內容(因此重定向到file
, 而資訊數據使用標準錯誤顯示。