我正在尝试从命令中取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)
这也不起作用。
答案 0 :(得分:3)
鉴于logger的手册页,您正在寻找bash
的{{3}}并且:
ping foobar 2> >(logger -s 2>> ~/mylog.log)
这会运行ping foobar
,标准错误会通过进程替换进入进程logger -s
。 logger
进程将信息写入syslog
(logger
的主要目的),并将输出写入标准错误(-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