我使用以下语法将标准输出和标准错误发送到 $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> 错误 > 输出