如何记录 shell 脚本的一部分的输出

如何记录 shell 脚本的一部分的输出

我正在寻找一种简洁的解决方案,用于将部分 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

相关内容