2

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

#!/bin/bash

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

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

反正有重定向stderrlogger命令吗?

编辑

我试图避免使用|,因为我也想在if测试中使用重定向。

我也尝试过这种方式:

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

这也不起作用。

4

3 回答 3

6

鉴于logger的手册页,您正在寻找bash进程替换,并且:

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

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

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

于 2013-06-29T00:25:57.853 回答
2

如果你只想要标准错误......

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

这应该交换 sderr 和 stdout。

于 2013-06-28T19:54:32.497 回答
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
于 2013-06-28T19:40:28.467 回答