将stderr重定向到记录器,然后重定向到文件

时间:2013-06-28 19:25:11

标签: linux bash logging stderr

我正在尝试从命令中取stderr并将其重定向到logger -s命令(将其输入写入syslog并且-s选项发送副本输入到logger的标准错误)然后最终到这样的文件:

#!/bin/bash

ping foobar 2> logger -s 2>> ~/mylog.log

不幸的是,这会创建一个logger文件和一个mylog.log文件。所以我假设初始2>创建了一个logger文件,然后2>>创建了一个新的mylog.log文件。

是否有将stderr重定向到logger命令?

修改

我正在尝试避免使用|,因为我也希望在if测试中使用重定向。

我也尝试过这种方式:

ping foobar 2> $(logger -s 2>> ~/mylog.log)

这也不起作用。

3 个答案:

答案 0 :(得分:3)

鉴于logger的手册页,您正在寻找bash的{​​{3}}并且:

ping foobar 2> >(logger -s 2>> ~/mylog.log)

这会运行ping foobar,标准错误会通过进程替换进入进程logger -slogger进程将信息写入sysloglogger的主要目的),并将输出写入标准错误(-s选项)。第二个I / O重定向将logger的标准错误附加到文件~/mylog.log

命令的返回状态是ping的返回状态。这样可以避免使用管道,因此您可以使用if测试等中编写的命令

答案 1 :(得分:2)

如果你只想要stderr ......

ping foobar  3>&1 1>&2 2>&3 | logger >> ~/mylog.log

这应该交换sderr和stdout。

答案 2 :(得分:1)

您通常无法重定向到多个文件。这就是tee的用途。此外,如果您要使用tee需要来使用管道。

ping foobar 2>&1 >/dev/null | tee -a ~/mylog.log | logger

这会将stderr重定向到stdout,然后将stdout重定向到/ dev / null。 tee将其输入附加到文件~/mylog.log-a用于附加),并将其复制到输出,然后输出到logger

如果要在if测试中使用任何生成的复杂命令,可以将命令放在函数中。您可以使用bash的$PIPESTATUS来检查管道中的每个退出状态(并从函数中返回):

function bla {
    ping | successful_cmd   # ... or whatever
    [ 0 -eq ${PIPESTATUS[0]} ]   # return 0 (true) if the exit status of ping was 0 (true)
}

该函数的返回状态将是执行的最后一个命令的返回状态。你可以使用这样的函数:

if bla; then echo true; else echo false; fi
# or
bla && echo success