首页 > 解决方案 > 如果未提供文件名,如何将文本重定向到文件或标准输出

问题描述

我正在编写一个 bash 脚本,并希望将文件名用户写入其数据的输入参数之一。但是,如果没有提供文件名,我想将相同的数据输出到标准输出。

有没有一种简单的方法可以做到这一点,而无需到处都有一堆 if 语句来尝试检查数据应该去哪里?

谢谢

标签: bashstdout

解决方案


如果exec仅传递重定向,它会更改文件描述符在当前 shell 实例中指向的位置,而不是用另一个进程替换该 shell。

您可以使用它有条件地就地重定向标准输出:

#!/usr/bin/env bash
output_file=$1  # set this however you choose

[[ $output_file ]] && exec >"$output_file"  # make stdout point to output_file

echo "This is written either to stdout, or to the output file"

使用 bash 4.1 或更高版本,如果您不想为整个程序及其子程序覆盖 stdout,还可以变得更漂亮,分配一个新的文件描述符并使用一个变量来引用它:

#!/usr/bin/env bash
case $BASH_VERSION in ''|[123].*)|4.0.*) echo "ERROR: Bash 4.1 required" >&2; exit 1;; esac

output_fd=1                                            # default to stdout
[[ $output_file ]] && exec {output_fd}>"$output_file"  # or override w/ named file

echo "This is written to either stdout, or to the output file" >&$output_fd

>>"$output_file"任何一种方法都比反复使用要有效得多,因为>>"$output_file"每次使用重定向运算符时都会重新打开输出文件;而>&$output_fd重用已经打开的文件描述符,只需要运行一个fdup()操作将其复制到插槽 1 以获取输出被重定向到那里的单个命令。


推荐阅读