Bash

如果成功則將標準輸出重定向到命令-A,否則將標準錯誤重定向到命令-b。同時避免使用臨時文件

  • November 27, 2019

我有一個命令,它在高興時寫入標準輸出,而在不高興時寫入標準錯誤。我想檢查命令的退出狀態並使用 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並查看命令是否成功執行,並且仍然將命令的結果儲存stdoutstderr變數中

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

注意:自發布答案的第一個版本以來,問題標題已重新措辭。

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