bash - 如果未提供文件名,如何将文本重定向到文件或标准输出
问题描述
我正在编写一个 bash 脚本,并希望将文件名用户写入其数据的输入参数之一。但是,如果没有提供文件名,我想将相同的数据输出到标准输出。
有没有一种简单的方法可以做到这一点,而无需到处都有一堆 if 语句来尝试检查数据应该去哪里?
谢谢
解决方案
如果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 以获取输出被重定向到那里的单个命令。
推荐阅读
- php - Laravel 和时间戳 - 它总是一个日期列吗?
- mobile - Bootstrap 4 在 Chrome 中没有响应
- reactjs - 使用 React Js 的最佳方式是什么:Redux、Hooks 或 Context?
- python - DataBricks:在 arrays_zip 函数中使用变量
- java - 如果其中没有奇数值,则返回 0 的数组
- java - 使用 maven surefire 测试花费的时间超过指定的超时时间
- apache-spark - 为什么使用for循环时python spark慢
- exception - 如何在用例图中显示异常?
- c# - 我是否需要使用实体框架将属性 int 显式添加到组合对象的外键中?
- python - PYTHON:在 tkinter 错误中绘制图像:“类型对象 'Image' 没有属性 'open'”