bash tee脚本输出到文件和stdout不会更新时间戳

时间:2017-09-26 15:36:25

标签: bash

我有以下bash命令将脚本输出发送到stdout和logfile。它工作,我可以看到实时输出。但是日期并没有改变。有没有办法指示执行官以动态的方式评估日期。

#!/bin/bash

LOGFILE="/tmp/te/script.log"
exec 1> >( stdbuf -e 0 -o 0 sed "s/^/$(date '+[%F %T]'): /" | tee -a ${LOGFILE}) 2>&1

echo "Started"
sleep 2
echo "Done sleeping"
sleep 2
echo "Another sleep"
sleep 2

echo "Done"

由于

2 个答案:

答案 0 :(得分:3)

您可能希望使用ts来添加时间戳。对于Ubuntu,apt install moreutils

exec 1> >(stdbuf -e0 -o0 ts '[%F %T]' | tee -a "$LOGFILE") 2>&1
# ...................... ^^^^^^^^^^^^

答案 1 :(得分:0)

如果你有bash 4.1或更新版本,它有一种非常有效的方法来通过printf %()T计算时间戳。因此:

logfile="/tmp/te/script.log"
exec > >(while IFS= read -r line; do
          printf '%([%F %T])T %s\n' -1 "$line"
         done >>"$logfile") 2>&1

这使用BashFAQ #1 while read循环来迭代行,并使用printf生成一行输出,其中包含每行的当前时间戳。

(如果你收到错误printf: `(': invalid format character,这意味着你的bash太旧了;你可以改为printf '%s %s\n' "$(date '+[%F %T]')" "$line",但这会慢得多。) < / p>