我有一个用于自动更新的 bash 脚本。我想记录该脚本的所有输出,并在每一行前面添加一个时间戳。我不知道如何将其添加到我已有的内容中。
LOGFILE="logdir/update.sh.$(date +%Y-%m-%d_%H:%M).log"
exec 1>$LOGFILE 2>&1
这将我的脚本的输出正确重定向到文件,但(显然)没有添加日期到该行。我怎样才能添加这个?
例如,我希望记录的输出如下所示:
[2019-11-07 1:43:45 PM]: Ign http://security.debian.org jessie/updates InRelease
我不想在我的脚本的每个命令前面添加任何内容,我希望在整个脚本中全局地添加时间戳并记录任何一个命令输出的每一行。
答案1
您可以将脚本的标准输出重定向到添加时间戳的程序,然后使用exec
.使用ts
中提到的命令这个答案,这应该有效:
#!/bin/bash
logfile="logdir/update.sh.$(date +%Y-%m-%d_%H:%M).log"
exec 1>> >(ts '[%Y-%m-%d %H:%M:%S]' > "$logfile") 2>&1
echo doing some real work...
这里的进程替换的工作方式有点像管道,只是不能将常规管道与exec
.它不是一个标准功能,但可以在通常的功能更强大的 shell 中使用:Bash、ksh 和 zsh。
当然除了ts
当然,除了该问题的答案在命令的每一行输出前添加时间戳