如何解决在重定向到文件和传递到流程之间动态选择
假设具有通用格式的shell脚本
(
# ... lots of code here
) > logfile 2>&1
有一个功能请求,可以选择将日志以及将要写入的文件转储到终端上
(
# ... lots of code here
) 2>&1 | tee logfile
问题是,如何基于shell变量的值在这两个管道结构之间切换?理想情况下,在日志不发送到终端的情况下,无需进行cat
处理或类似操作,即可提高效率。
仅使用POSIX shell功能是一个硬性要求。另外,由于zsh的较早版本中的错误,括号内的代码无法移入shell函数中。
解决方法
我想是
(
# ... lots of code here
) 2>&1 |
if test "$want_terminal_output" = yes; then
tee logfile
else
cat > logfile
fi
是的,有一个(很有用!)cat
。一个程序的效率真的很关键吗?我明白为什么有人会认为它不美观。如果它伤害您的眼睛,请在外壳中编写一个读/写循环并对其进行概要分析。当然,您总是可以复制lots of code
并使用在当今时代如此流行的剪切粘贴方法来避免cat
:-)
使用cat
应该没问题,但是如果有的话:
switcher.sh
:
#!/bin/sh
if $TERMINAL; then
OUTFILE=/dev/tty
else
OUTFILE=/dev/null
fi
(
echo hello
) | tee logfile > $OUTFILE
echo "## log file ##"
cat logfile
$ TERMINAL=false ./switcher.sh
## log file ##
hello
$ TERMINAL=true ./switcher.sh
hello
## log file ##
hello
tee
和/dev/null
的实现使得不会有多余的缓冲区副本。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。