我有以下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"
由于
答案 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>