如果給出參數則輸出到檔案的簡潔方法,否則輸出到 stdout

如果給出參數則輸出到檔案的簡潔方法,否則輸出到 stdout

我希望我的腳本輸出到標準輸出,除非它取得檔案名稱作為參數。一個明顯的方法是這樣的:

if [ -e "$1" ]; then
  command_with_output >$1
else
  command_with_output
fi

它非常醜陋並且有重複,所以我想要一種更簡潔的方式來做到這一點。

我嘗試了以下方法,但它不起作用。

[ -e "$1" ] && outfile=$1 || outfile='&1'
command_with_output >$outfile

編輯:這不會改變答案的相關性,但我在提出問題後意識到這才touch "$1" && outfile=$1是我真正需要的,而不是[ -e "$1" ] && outfile=$1因為文件可能尚不存在,並且我想確保我可以寫入或創建它,不僅僅是它的存在。我不會改變問題,因為這會使答案不同步。

答案1

exec可用於將目前腳本的標準輸出重新導向到另一個檔案。

[ -e "$1" ] && exec > $1
command_with_output

答案2

另一種方法是$1如果傳遞了文件名,則將其用作文件名,/dev/stdout否則(這是 Linux 下的符號鏈接/proc/self/fd/1,在許多其他 UNIX 變體上是具有相同含義的設備節點)。例如,將其放在腳本的頂部:

if [ -e "$1" ]; then
    filename=$1
else
    filename=/dev/stdout
fi

然後將每個命令的輸出重新導向到$filename

答案3

如果除了文件參數之外不接受任何參數,這也將起作用:

command_with_output > ${1:-/dev/stdout}

編輯:或者更好,因為你可能也在乎錯誤:

command_with_output &> ${1:-/dev/stdout}

相關內容