如果给出参数则输出到文件的简洁方法,否则输出到 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}

相关内容