首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >BASH:将stdout和stderr记录到文件中并在屏幕上显示->获得正确的错误代码

BASH:将stdout和stderr记录到文件中并在屏幕上显示->获得正确的错误代码
EN

Stack Overflow用户
提问于 2017-11-03 16:46:17
回答 1查看 118关注 0票数 1

我想将带有时间戳的stdout和stderr记录到日志文件中,并在屏幕上查看它。因此,我将stderr重定向到stdout,使用awk将时间戳添加到日志文件中。但是获取正确的错误代码有一个问题。

下面是一个没有日志记录的示例:

代码语言:javascript
运行
复制
$ less notexists.txt
notexists.txt: No such file or directory
$ echo $?
1

错误代码是正确的

下面是日志记录的示例:

代码语言:javascript
运行
复制
$ 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而不是重定向?

EN

回答 1

Stack Overflow用户

发布于 2017-11-03 17:13:17

显然,如果less的标准输出不是终端,那么它就没有非零的退出状态。如果你强迫它

代码语言:javascript
运行
复制
$ less notexists.txt  2>&1 > /dev/tty | awk '{ print strftime("[%Y-%m-%d %H:%M:%S]"), $0; fflush(); }' | tee -a log.txt
#                          ^^^^^^^^^^

您将获得预期的退出状态,尽管您将不再在日志文件中获得标准输出。

下面是来自less v487的相关代码:

代码语言:javascript
运行
复制
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分钟查看源代码,所以我不知道这种行为是否有道理。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47091603

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档