![如果成功,則將 stdout 重新導向到 command-A,否則將 stderr 重新導向到 command-b。同時避免使用暫存文件](https://rvso.com/image/164722/%E5%A6%82%E6%9E%9C%E6%88%90%E5%8A%9F%EF%BC%8C%E5%89%87%E5%B0%87%20stdout%20%E9%87%8D%E6%96%B0%E5%B0%8E%E5%90%91%E5%88%B0%20command-A%EF%BC%8C%E5%90%A6%E5%89%87%E5%B0%87%20stderr%20%E9%87%8D%E6%96%B0%E5%B0%8E%E5%90%91%E5%88%B0%20command-b%E3%80%82%E5%90%8C%E6%99%82%E9%81%BF%E5%85%8D%E4%BD%BF%E7%94%A8%E6%9A%AB%E5%AD%98%E6%96%87%E4%BB%B6.png)
我有一個命令,當它高興時寫入 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
,查看命令是否成功運行,並且仍然將命令的結果儲存在變數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
注意:自從答案的第一個版本發布以來,問題標題已重新措辭。
答案2
你可以使用下面的程式碼
if [[ $? == 0 ]]
then
command 1>stdout.txt
else
echo "exit code is not successfull"
command 2> stderr.txt
fi