我无法让Dennis的单线工作很简单,所以这是一个复杂得多的方法。我会先尝试一下。
如前所述,您可以使用exec重定向整个脚本的标准错误和标准输出。像这样:
exec > $LOGFILE 2>&1
这会将所有stderr和stdout输出到$ LOGFILE。
现在,由于您希望将此内容以及日志文件显示在控制台中,因此您还必须使用命名管道来使exec写入和发球以便读取。
(尽管显然丹尼尔的单线方式也不同,但从技术上讲,丹尼尔的单线也可以这样做)mkfifo $PIPEFILE
。然后执行以下操作。
#开始将tee写入日志文件,但从命名管道中提取其输入。
三通$ LOGFILE <$ PIPEFILE&
#捕获等待命令的T恤的进程ID。
TEEPID = $!
#将其余的stderr和stdout重定向到我们的命名管道。
exec> $ PIPEFILE 2>&1
回显“在此处进行命令”
回声“他们所有的标准将被淘汰。”
回显“他们的标准错误也是如此”>&2
#关闭stderr和stdout文件描述符。
exec 1>&-2>&-
#等待三通完成,因为管道的另一端已经关闭。
等待$ TEEPID
如果想彻底了解,可以在脚本的开头和结尾创建和销毁命名管道文件。
作为记录,我从随机人的非常有信息的博客文章中收集了其中的大部分内容:(存档版本)