Linux:如何将标准输出和标准错误重定向到记录器?

fre*_*set 29 shell io-redirection stdout stdin

我有一个程序需要在启动时运行,它在 stdout 和 stderr 上有输出,我想使用 logger 命令重定向到系统日志。我在启动脚本中的内容是:

/home/dirname/application_name -v|logger 2>&1 &

这将标准输出重定向到系统日志就好了,但标准错误正在进入控制台,所以我需要改进命令。

slm*_*slm 38

您需要在将 STDERR 和 STDOUT 的输出通过管道传输到logger. 试试这个:

/home/dirname/application_name -v 2>&1 | logger &
Run Code Online (Sandbox Code Playgroud)

例子

$ echo "hi" 2>&1 | logger &
[1] 26818
[1]+  Done                    echo "hi" 2>&1 | logger

$ sudo tail /var/log/messages
Apr 12 17:53:57 greeneggs saml: hi
Run Code Online (Sandbox Code Playgroud)

如果在实际 Bash shell 中谨慎使用,您也可以在此处使用缩写符号(不要与 Dash 混淆):

$ echo "hi" |& logger &
Run Code Online (Sandbox Code Playgroud)

注意:这相当于<cmd1> 2>&1 | <cmd2>. 再次仅在以交互方式使用实际 Bash shell 时使用上述内容,这将是处理它的好方法。

摘自ABSG

# |& 被添加到 Bash 4 作为 2>&1 | 的缩写。

参考

  • slm,没有冒犯的意思,但后一种形式是猖獗的 bashism 滥用。这种不必要的速记可能导致的问题数量根本不值得从它们的使用中获得的微薄收益。例如,即使只是在你自己的机器上,如果你把上面的内容放在一个脚本中并且 `dash` 试图在启动时执行脚本只会失败并破坏你的启动过程......好吧......当这样的语法是提到它应该总是在 *interactive* shells *only* 的上下文中,或者,至少,这是我的意见。 (2认同)
  • 好吧,这可能不是必需的——你不能以足够快的速度输入它来在交互式 shell 中产生影响——为此我使用 zsh。但是,对于脚本,dash 比我尝试过的任何其他脚本都要快。 (2认同)