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/null
tee
将其输入附加到文件
~/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
。您是否希望将标准错误发送到两个文件,一个在追加模式,另一个在普通写入模式?@JonathanLeffler
logger
是我正在尝试使用的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