【问题标题】:bash tee script output to file and stdout does not update timestamp [duplicate]bash tee脚本输出到文件和stdout不更新时间戳[重复]
【发布时间】:2017-09-26 15:36:25
【问题描述】:

我有以下 bash 命令将脚本输出到标准输出和日志文件。它有效,我可以看到实时输出。但是日期没有改变。有什么方法可以指示 exec 以动态方式评估日期。

#!/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"

谢谢

【问题讨论】:

  • 完全可以预料。 sed 被启动一次date 被运行一次——你不希望它以任何其他方式运行;调用外部工具非常慢,因此如果您有快速运行的内容,日志过程不一定能跟上。

标签: bash


【解决方案1】:

您可能想改用ts 添加时间戳。对于 Ubuntu,apt install moreutils

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

【讨论】:

    【解决方案2】:

    如果你有 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",但这会慢得多)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-06
      • 1970-01-01
      • 1970-01-01
      • 2018-06-04
      相关资源
      最近更新 更多