在bash / ksh中我们可以添加时间戳到STDERR重定向?
例如。 myscript.sh 2> error.log
我想在日志上写一个时间戳。
如果你正在谈论每一行的最新时间戳,这是你可能想在你的实际脚本中做的事情(但如果你没有权力改变它,下面的一个漂亮的解决方案)。如果你只是想要一个标记日期在自己的一行,然后你的脚本开始写作,我会使用:
( 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行写入到所需的文件。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。