我想将带有时间戳的stdout和stderr记录到日志文件中,并在屏幕上查看它。因此,我将stderr重定向到stdout,使用awk将时间戳添加到日志文件中。但是获取正确的错误代码有一个问题。
下面是一个没有日志记录的示例:
$ less notexists.txt
notexists.txt: No such file or directory
$ echo $?
1
错误代码是正确的
下面是日志记录的示例:
$ less notexists.txt 2>&1 | awk '{ print strftime("[%Y-%m-%d %H:%M:%S]"), $0; fflush(); }' | tee -a log.txt
[2017-10-23 17:19:59] notexists.txt: No such file or directory
$ echo ${PIPESTATUS[*]}
0 0 0
三个部分的错误代码都是0,但第一个部分的错误代码应该是1。我认为问题可能是stderr的重定向。
有没有办法将stdout和stderr的时间戳记录到日志文件中,并在屏幕上查看并获得正确的错误代码?
是否可以复制stderr而不是重定向?
发布于 2017-11-03 17:13:17
显然,如果less
的标准输出不是终端,那么它就没有非零的退出状态。如果你强迫它
$ less notexists.txt 2>&1 > /dev/tty | awk '{ print strftime("[%Y-%m-%d %H:%M:%S]"), $0; fflush(); }' | tee -a log.txt
# ^^^^^^^^^^
您将获得预期的退出状态,尽管您将不再在日志文件中获得标准输出。
下面是来自less
v487的相关代码:
if (!is_tty)
{
/*
* Output is not a tty.
* Just copy the input file(s) to output.
*/
SET_BINARY(1);
if (nifile() == 0)
{
if (edit_stdin() == 0)
cat_file();
} else if (edit_first() == 0)
{
do {
cat_file();
} while (edit_next(1) == 0);
}
quit(QUIT_OK);
}
因此,当标准输出不是终端时,less
的行为就像cat
一样,只是它忽略了试图打开其输入的任何错误。无论发生什么,它都会退出0。
可以说,这是一个bug,但我花了2分钟查看源代码,所以我不知道这种行为是否有道理。
https://stackoverflow.com/questions/47091603
复制相似问题