Bash

Stderr 重定向意外地重定向了一些 BASH 內置函式

  • August 14, 2018

我試圖對執行互動式 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並仍然使用readselect從使用者那裡收集資訊,而不會“污染”實際輸出。

標準輸出是程序的典型輸出,理想情況下,它可以通過管道傳輸到另一個程序的標準輸入中,既不麻煩也不麻煩。

這也是為什麼curl,例如,在標準錯誤而不是標準輸出上顯示其下載進度;您可以curl http://www.example.com/path/to/file > file並且僅file顯示 的內容(因此重定向到file, 而資訊數據使用標準錯誤顯示。

引用自:https://unix.stackexchange.com/questions/462539