如果你正在谈论每一行的最新时间戳,这是你可能想在你的实际脚本中做的事情(但如果你没有权力改变它,下面的一个漂亮的解决方案)。如果你只是想要一个标记日期在自己的一行,然后你的脚本开始写作,我会使用:
( date 1>&2 ; myscript.sh ) 2>error.log
你需要的是一个技巧,管道stderr通过另一个程序,可以添加时间戳每行。你可以用一个C程序做到这一点,但有一个更加狡猾的方式使用bash。
首先,创建一个脚本,将时间戳添加到每一行(称为predate.sh):
#!/bin/bash while read line ; do echo "$(date): ${line}" done
例如:
( echo a ; sleep 5 ; echo b ; sleep 2 ; echo c ) | ./predate.sh
产生:
Fri Oct 2 12:31:39 WAST 2009: a Fri Oct 2 12:31:44 WAST 2009: b Fri Oct 2 12:31:46 WAST 2009: c
然后你需要另一个技巧,可以交换stdout和stderr,这个小怪物在这里:
( myscript.sh 3>&1 1>&2- 2>&3- )
然后很简单的结合两个技巧的时间戳stdout并将它重定向到你的文件:
( myscript.sh 3>&1 1>&2- 2>&3- ) | ./predate.sh >error.log
以下脚本演示了此操作:
pax> cat predate.sh #!/bin/bash while read line ; do echo "$(date): ${line}" done pax> cat tstdate.sh #!/bin/bash echo a to stderr then wait five seconds 1>&2 sleep 5 echo b to stderr then wait two seconds 1>&2 sleep 2 echo c to stderr 1>&2 echo d to stdout pax> ( ( ./tstdate.sh ) 3>&1 1>&2- 2>&3- ) | ./predate.sh >error.log d to stdout pax> cat error.log Fri Oct 2 12:49:40 WAST 2009: a to stderr then wait five seconds Fri Oct 2 12:49:45 WAST 2009: b to stderr then wait two seconds Fri Oct 2 12:49:47 WAST 2009: c to stderr
如前所述,predate.sh将在每一行前面加上一个时间戳,而tstdate.sh只是一个测试程序,以特定的时间间隔写入stdout和stderr。
当你运行命令,你实际上得到“d to stdout”写到stderr(但这是你的TTY设备或任何其他stdout可能是当你开始)。带时间戳的stderr行写入到所需的文件。