我希望我的脚本输出到标准输出,除非它获取文件名作为参数。一个明显的方法是这样的:
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}