首页 > 解决方案 > 在重定向到文件和管道到进程之间动态选择

问题描述

假设一个具有一般形式的 shell 脚本

(
    # ... lots of code here
) > logfile 2>&1

有一个功能请求可选择将日志转储到终端以及文件,该文件将被写入

(
    # ... lots of code here
) 2>&1 | tee logfile

问题是,如何根据 shell 变量的值在这两个管道结构之间切换?cat理想情况下,在日志不进入终端的情况下,为了提高效率,不需要过程或类似的东西。

仅使用 POSIX shell 功能是一项硬性要求。此外,由于旧版本 zsh 中的错误,括号内的代码无法移动到 shell 函数中。

标签: pipeshposix

解决方案


我的看法是

(
   # ... lots of code here
) 2>&1 |
if test "$want_terminal_output" = yes; then
   tee logfile
else
   cat > logfile
fi

是的,有一个(有用的!)cat。单个程序的效率真的很关键吗?我明白为什么有人会认为它不美观。如果它伤害了您的眼睛,请在 shell 中编写一个读/写循环并对其进行分析。当然,你总是可以复制lots of code和避免cat使用在这个时代如此流行的剪切-粘贴编程方式:-)


推荐阅读