Unix

分別為 shell 和程序重定向 STDERR

  • June 13, 2012

我正在做一些審計自動化,這個例子描述了檢查 Java 的版本,即使其他程序做同樣的事情。

“java -version”的輸出到 STDERR,它很容易重定向,但我想將 shell 錯誤(例如,當 java 二進製文件失去時)發送到 /dev/null。似乎 shell 重定向是一個全有或全無的命題。

到目前為止,我最有希望的嘗試是:

{ /bin/ksh "{java -version 2>&1;}"; } 2>/dev/null

…正確地將 -version 命令的輸出發送到 STDOUT,但如果 java 不存在,它也會將 shell“未找到”錯誤發送到 STDOUT。我不想看到那個消息。

與以下行為相同:

{ /bin/ksh "{java -version 2>&1;}" 2>/dev/null; }

有誰知道限制重定向范圍的方法,以便每個程序都有自己的?我不僅限於 ksh,但出於環境原因,它必須是基於 shell 的單線。

是否無法檢查是否找到了 java 並且可以執行?

test -x "$(which java)" && java -version 2>&1

或者如果您也想繞過測試並檢查 java 錯誤

java -version 2>/dev/null 1>/dev/null && java -version 2>&1

您可以重定向到其他描述符。這適用於 bash,我認為它也適用於 ksh:

exec 3>javalog
java ... 2>&1 >&3
exec 3>&-

引用自:https://serverfault.com/questions/398361