Bash 脚本将所有输出重定向到文件

Bash 脚本将所有输出重定向到文件

我有以下脚本,可以在桌面 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 1xtrack 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"

相关内容