[英]Hide command output in Bash if exit code was not zero
我有一個 Bash 命令,它在 STDOUT 上產生輸出,並且可以有一個零或非零的退出代碼。
如果退出代碼不為零,我想隱藏輸出,如果退出代碼為零,我想分別顯示輸出。
如何在不運行命令兩次的情況下實現這一點?
狀態碼僅在進程終止時才知道。 因此,完成您所要求的唯一方法是運行將其stdout
重定向到臨時文件的進程,然后在它終止時檢查其狀態代碼。 如果不為零,則刪除臨時文件,如果為零,則將臨時文件的內容輸出到stdout
。
這是一個自動化的 bash 腳本:
#!/bin/bash
temp_file=$(mktemp)
"$@" > temp_file
if [[ $? == 0 ]]; then
cat "$temp_file"
fi
rm "$temp_file"
如果您將此腳本稱為mute
,那么您可以使用命令foo --bar
如下
mute foo --bar
如果輸出為零,則打印輸出
output="$(command)" if [[ $? -eq 0 ]] ; then echo "$output" fi
您可以捕獲命令的輸出並檢查其退出狀態,而無需依賴脆弱的$?
:
if output="$(command)" ; then
echo "$output"
fi
將命令和測試解耦的模式存在問題,原因如下:
如果您的腳本使用set -e
運行,它將在命令失敗時立即退出,這可能不是您想要的。 試試看:
#!/bin/bash set -e output="$(nonexistent_command)" echo "Unreachable code" if [[ $? -eq 0 ]] ; then echo "$output" fi
如果您在命令和測試之間插入任何內容,則比較將是錯誤的。
這就是要點。 有關更多信息,請參閱相關的ShellCheck Wiki 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.