我有以下脚本,可以在桌面 CentOS 7 上运行良好,但在 digitalocean droplet 上的服务器 CentOS 7 上无法正常工作。
问题是它不会在完成后自动退出,我必须按 Enter 才能退出
#!/bin/bash
LOG_FILE=/var/log/mylog.log
if [ -f $LOG_FILE ]; then
mv $LOG_FILE $LOG_FILE.$(date +%s)
fi
exec > >(tee -a -i $LOG_FILE)
exec 2>&1
echo "track 1x"
echo "track 2x"
答案1
以不会触发这种竞争条件的方式构造此代码的另一种可能方法是将其余代码分组到一个{ ... }
块中并通过管道传输到tee
。
这样,bash 将保证wait()
在tee
结束脚本之前完成。
#!/bin/bash
LOG_FILE=/var/log/mylog.log
if [[ -f "$LOG_FILE" ]]; then
mv "$LOG_FILE" "$LOG_FILE.$(date +%s)"
fi
{
echo "track 1x"
echo "track 2x"
} 2>&1 | tee -a -i "$LOG_FILE"
答案2
看起来您需要按回车键,但其实不需要。
问题是,有时可能会出现下一个提示前进程替换的输出tee
完成。新提示符出现在tee
输出之前还是之后取决于多任务处理的变化。它可能以某种方式随机出现。
例如,我运行了你的脚本,输出如下:
$ bash script
$ track 1x
track 2x
第二个$
是新的提示符。track 1x
和track 2x
行是tee
出现的输出后提示已写好。您可以输入新命令,而无需先输入 Enter。例如,我在这里这样做了:
$ bash script
$ track 1x
track 2x
date
Thu Aug 1 22:52:45 PDT 2019
我输入了一个新命令,,date
该命令被处理并产生输出Thu Aug 1 22:52:45 PDT 2019
。在输入新命令之前无需按回车键。
答案3
我添加了新行 sleep .1 并且它起作用了@sourcehttps://stackoverflow.com/questions/30687504/redirected-output-hangs-when-using-tee
#!/bin/bash
LOG_FILE=/var/log/mylog.log
if [ -f $LOG_FILE ]; then
mv $LOG_FILE $LOG_FILE.$(date +%s)
fi
exec > >(tee -a -i $LOG_FILE)
exec 2>&1
sleep .1
echo "track 1x"
echo "track 2x"