Bash
如果成功則將標準輸出重定向到命令-A,否則將標準錯誤重定向到命令-b。同時避免使用臨時文件
我有一個命令,它在高興時寫入標準輸出,而在不高興時寫入標準錯誤。我想檢查命令的退出狀態並使用 stdout 或 stderr 做一些事情。
if ! command >/tmp/stdout 2>/tmp/stderr; then // do something with /tmp/stderr exit 1 fi // do something else with /tmp/stdout
當然可以只有一個文件而不是兩個文件,但我想擺脫所有文件,而不僅僅是一個文件。
有沒有辦法避免臨時文件?我嘗試使用 mkfifo 和自定義文件描述符,但我無法做到這一點。
您可以在條件中使用命令替換
$(..)
語法if
並查看命令是否成功執行,並且仍然將命令的結果儲存stdout
在stderr
變數中if ! var=$(cmd 2>&1); then printf 'process stderr contents from $var' fi
如果我模擬
cmd
執行作為執行此操作的簡單腳本,您可以看到它工作# cat temp.sh echo foo >&2 exit 1
如果我將腳本執行為
if ! var=$(bash tmp.sh 2>&1); then printf '%s\n' 'process stderr contents from $var' printf '%s\n' "$var" fi
如果命令替換成功,您可以使用相同的方式進行擷取
stdout
,這將恰好出現在else
上面範例中的子句中。在任何一種情況下,操作"$var"
(確保引號打開)的內容都將確保您正在處理結果,就好像它儲存在文件中一樣。您可以繼續並引用命令替換語法,以不讓shell 對結果執行分詞。例如,如下所示。對於像我在這裡展示的那樣簡單的情況可能不需要它,但是對於結果包含一些特殊的 shell 元字元的情況
if ! var="$(bash tmp.sh 2>&1)"; then
注意:自發布答案的第一個版本以來,問題標題已重新措辭。