为什么使用 tee 的重定向不能按预期工作?

Ver*_*nge 4 shell tee io-redirection

我想要获得的是将脚本的所有输出记录到文件中,全部记录在脚本本身中,将我在屏幕上看到的所有内容保存在日志文件中。如果我不重定向到文件,脚本将按预期工作,继续无限循环,直到我按 CTRL+C;当发生这种情况时,它会在屏幕上打印几条消息并退出。如果我尝试使用 tee 重定向到文件,它不仅不会打印消息,而且日志也不完整,只有循环行,之后什么都没有。这是脚本(删减版):

#!/bin/sh
EXIT=0
COUNT=0
{
while [ $EXIT -eq 0 ]
do
  COUNT=$((COUNT+1)) && echo "Eternal loop $COUNT" && sleep 1
  trap 'EXIT=1; echo "Loop interrupted by user, exiting."' 15 2 8 20
done
echo "Out of loop, eternity ends"
} | tee log.log 2>&1
Run Code Online (Sandbox Code Playgroud)

我四处阅读,不明白我遇到的问题是否是由管道到 Tee、stderr 和 stdout 或我如何使用 trap 引起的。我是 shell 脚本编写的菜鸟,这令人沮丧,任何帮助将不胜感激。谢谢。

编辑1:阅读切普纳的答案后,我修改了脚本,如下所示:

#!/bin/sh
EXIT=0
COUNT=0
rm log.log
while [ $EXIT -eq 0 ]
do
COUNT=$((COUNT+1)) && echo "Eternal loop $COUNT" | tee -a log.log && sleep 1
trap 'EXIT=1; echo "Loop interrupted by user, exiting." | tee -a log.log' 15 2 8 20
done
echo "Out of loop, eternity ends" | tee -a log.log
Run Code Online (Sandbox Code Playgroud)

它可以工作,它将输出记录到日志文件中,并且我仍然在屏幕上看到输出,这正是我想要的。必须在其他脚本上尝试一下,但我想应该没问题。现在还有一个问题:如果我有很多命令而不是只有 3 个命令,这个解决方案是否足够“干净”?我的意思是,我召唤的所有 T 恤会怎样?有没有更好的方法来做到这一点,比如更精致?

gen*_*age 6

不完全是您所要求的,但是当您想要记录在进程中看到的所有内容时,脚本命令比处理重定向更容易。

如果您仍然想使用 tee,请将重定向移到管道前面

somecommand 2>&1 | tee outfile
Run Code Online (Sandbox Code Playgroud)