如果成功,則將 stdout 重新導向到 command-A,否則將 stderr 重新導向到 command-b。同時避免使用暫存文件

如果成功,則將 stdout 重新導向到 command-A,否則將 stderr 重新導向到 command-b。同時避免使用暫存文件

我有一個命令,當它高興時寫入 stdout,當它不高興時寫入 stderr。我想檢查命令的退出狀態並使用 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 和自訂文件描述符,但無法實現該功能。

答案1

$(..)您可以在條件中使用命令替換語法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

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

答案2

你可以使用下面的程式碼

if [[ $? == 0 ]]
then
command 1>stdout.txt
else
echo "exit code is not successfull"
command 2> stderr.txt
fi

相關內容