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