如何将标准输出和标准错误发送到两个文件

如何将标准输出和标准错误发送到两个文件

我使用以下语法将标准输出和标准错误发送到 $log 文件

log=/var/tmp/install.log
info=/tmp/info.log 

exec > $log 2>&1

如何将标准输出和标准错误也重定向到 /tmp/info.log 文件?

答案1

如果您使用的是 bash,则可以使用进程替换并tee

exec &> >(tee "$log" > "$info")

这会将两个流重定向到进程替换,其中tee将输出发送到"$log"stdin,然后将输出重定向到"$info".

否则,您可能必须启动一个后台进程来将内容发送/var/tmp/install.log/tmp/info.log

log=/var/tmp/install.log
info=/tmp/info.log 
exec > "$log" 2>&1
tail -n+1 -f "$log" > "$info" &

tail将在后台运行,将所有发送到 的内容发送/var/tmp/install.log/tmp/info.log

答案2

任务是即使应用程序删除了日志文件也保留日志输出。

通过使用 为日志文件创建第二个名称ln,日志中的数据将可以在两个名称下使用。如果删除其中一个名称,则另一名称下的数据仍然可用。

在脚本中:

log=/var/tmp/install.log
info=/tmp/info.log 

ln -f "$log" "$info"

exec >"$log" 2>&1

如果$log以前不存在,则需要在touch "$log"调用之前创建它ln

这假设两个名称驻留在同一文件系统上。

此答案并不假设您正在使用bash.它将与任何sh兼容的 shell 一起使用。

答案3

为了完整起见,您可以将 1> 写为 >,因为默认文件描述符是输出。所以 1> 和 > 是同一件事。

因此,命令 2> 错误 1> 输出变为命令 2> 错误 > 输出

相关内容