簡體   English   中英

如果退出代碼不為零,則在 Bash 中隱藏命令輸出

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM