Linux 将stderr重定向到记录器,然后重定向到文件
我试图从命令中获取Linux 将stderr重定向到记录器,然后重定向到文件,linux,bash,logging,stderr,Linux,Bash,Logging,Stderr,我试图从命令中获取stderr,并将其重定向到logger-s命令(该命令将其输入写入syslog,并且-s选项将输入的副本发送到logger的标准错误),然后最终发送到如下文件: #!/bin/bash ping foobar 2> logger -s 2>> ~/mylog.log if bla; then echo true; else echo false; fi # or bla && echo success 不幸的是,这会创建一个logger
stderr
,并将其重定向到logger-s
命令(该命令将其输入写入syslog
,并且-s
选项将输入的副本发送到logger
的标准错误),然后最终发送到如下文件:
#!/bin/bash
ping foobar 2> logger -s 2>> ~/mylog.log
if bla; then echo true; else echo false; fi
# or
bla && echo success
不幸的是,这会创建一个logger
文件和一个mylog.log
文件。因此,我假设初始的2>
创建一个logger
文件,然后2>
创建一个新的mylog.log
文件
是否仍然可以将stderr
重定向到logger
命令
编辑
我试图避免使用|
,因为我想在if
测试中也使用重定向
我也试过这样做:
ping foobar 2> $(logger -s 2>> ~/mylog.log)
这也不起作用。您通常无法重定向到多个文件。这就是
tee
的作用。此外,如果要使用T形三通
,则需要使用管道
ping foobar 2>&1 >/dev/null | tee -a ~/mylog.log | logger
这会将stderr重定向到stdout,然后将stdout重定向到/dev/nulltee
将其输入附加到文件~/mylog.log
(-a
用于附加)并将其复制到输出,然后通过管道将其传输到记录器
如果要在If测试中使用任何生成的复杂命令,可以将该命令放入函数中。可以使用bash的$PIPESTATUS
检查管道中的每个退出状态(并从函数返回):
函数的返回状态将是最后执行的命令的返回状态。您可以使用如下功能:
#!/bin/bash
ping foobar 2> logger -s 2>> ~/mylog.log
if bla; then echo true; else echo false; fi
# or
bla && echo success
如果你只想要stderr
ping foobar 3>&1 1>&2 2>&3 | logger >> ~/mylog.log
这应该可以交换sderr和stdout。给定的手册页,您正在查找的是bash
,并且:
这将运行ping foobar
,标准错误通过进程替换进入进程logger-s
。logger
过程将信息写入syslog
(logger
)并将输出写入标准错误(-s
选项)。第二个I/O重定向将标准错误从记录器添加到文件~/mylog.log
命令的返回状态是来自ping
的返回状态。这避免了管道,因此您可以使用if
tests等中编写的命令。您能否解释一下,如果您尝试执行的测试不适用于管道,会发生什么情况?日志记录程序是进程还是文件?编写时,代码为标准错误创建一个空文件logger
,然后改变主意并发送标准错误,以便将其附加到mylog.log
。您是否希望将标准错误发送到两个文件,一个在追加模式,另一个在普通写入模式?@JonathanLefflerlogger
是我正在尝试使用的unix程序。我无意中使用重定向创建了一个记录器文件,而我想将stderr
传递到记录器unix程序并将其重定向到一个文件。如果您试图测试ping是否成功,在使用管道的if测试中,这将如何工作?最初认为logger
是您想要将输出保存到的文件:D我编辑了答案。还添加了有关$PIPESTATUS.com的信息。太棒了!非常感谢!但是当我这样做时:ls 2>>(logger“adsad”),即使没有ls错误,我的系统日志也包含“adsad”字符串。@meso_2600:我想你会发现logger
应该这样做。如果你让它写一些东西,它会把它写到syslog
。您可以决定logger
是否不知道这是否是一个错误,而只是假设它是一个错误,或者logger
是否知道这是一个错误,因为它被要求写入它——最终结果是相同的。当被要求写时,logger
writes.ok,那么有没有办法在stderr上使用一行程序来告诉logger写点什么呢?我的意思是,在syslog中,我只想使用stderr