我希望能够在脚本本身中记录所有输出到文件的内容,将屏幕上所见的一切保存在日志文件中。如果不将输出重定向到文件,则脚本按预期工作,继续循环直到我按下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
我阅读了一些内容,无法确定我的问题是由于使用tee管道、标准错误和标准输出,还是由于我使用的陷阱trap的方式引起的。
我对shell脚本毫无经验,这让我很沮丧,感激任何帮助。
谢谢。
编辑1:在阅读chepner的答案后,我修改了脚本如下:
#!/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
而且它能够正常工作,将输出记录到日志文件中,并且我仍然可以在屏幕上看到输出,完全符合我的要求。现在有一个问题:如果我有很多命令而不仅仅是3个,这个解决方案是否足够“干净”?我的意思是,所有我调用的tee会发生什么情况?有没有更好的方法来做到这一点,比如更加精细的方法?
tee
或tee -a
命令没有起作用。谢谢! - Piotr Wittchen