我正在寻找一种简洁的解决方案,用于将部分 shell 脚本的输出记录到文件中。此外,我还希望能够在屏幕上跟踪实时输出。
exec
从“bash”(内置,“进程替换”)和的手册页中tee
,我期望以下行(在要记录的部分开始时调用)是一个解决方案:
exec >(tee -a logfile) 2>&1
不幸的是,这会导致权限错误(抱歉,原始输出是德语):
$ bash t
t: Zeile 1: /dev/fd/63: Keine Berechtigung
t: Zeile 1: exec: /dev/fd/63: Kann nicht ausführen: Keine Berechtigung
该系统基于Ubuntu 12.04 LTS。
如何将脚本的一部分协议到文件?
(将要协议的部分收集到一个函数中f
并使用f | tee -a logfile
会很困难,因为该部分跨越多个函数(的部分),我想logfile
在它们之间切换......)
先感谢您。
答案1
我必须承认,我不完全确定你的目标是什么......但是,你的exec
-trick 的正确语法应该如下(你只错过了一个>
):
exec > >(tee -a logfile) 2>&1
简单演示:
% 猫测试 /bin/bash #!/bin/bash echo stdout 未记录 echo stderr 未记录 >&2 执行>>(tee -a日志文件)2>&1 echo stdout 记录 echo stderr 记录 >&2 %bash 测试 stdout 未记录 stderr 未记录 % 记录的标准输出 stderr 已记录 %猫日志文件 标准输出已记录 stderr 已记录 %
您可以看到,exec
当脚本到达该行时,会再次打印提示,从而弄乱输出。那么,为什么不只记录 eg stdout
,而不stderr
记录脚本呢?
%(echo stdout;echo stderr >&2)| tee 日志文件 标准错误 标准输出 %猫日志文件 标准输出
答案2
您可以将想要登录的行括在括号中,然后通过 tee 管道输出:
echo this line isn\'t logged
(
echo this line is logged!
) | tee log_file
echo this line isn\'t logged