在shell脚本中使用logging器

我怎样才能在一个shell脚本中使用logging器?

如果我跑

ntpd -qnp pool.ntp.org 2> >(logger) 

在控制台中,它按预期工作。

如果我把它放到一个shell脚本中

 #!/bin/sh ntpd -qnp pool.ntp.org 2> >(logger) 

我得到以下错误:

 line 2: syntax error: unexpected redirection exited with code 2 

shell脚本有什么问题?

shebang是正确的,因为#!/ bin / sh和#!/ bin / bash都可以使用*,但是,IIRC,您应该使用不redirect的logging器,因为它不是文件。

试试这个脚本:

 #!/bin/sh ntpd -qnp pool.ntp.org 2>&1 |logger 

*如果你的脚本使用#!/ bin / sh,它们应该是posix兼容的,即在solaris和AIX上运行良好。 如果你使用了一些特定于bash的特性,必须使用#!/ bin / bash,因为没有更多的可移植性。

什么是错误的是,当你的hash-bang在说/bin/sh ,你正在使用bash-ism。 将其更改为#! /bin/bash #! /bin/bash ,它会工作。

我实际上已经检查了ntpd -qnp pool.ntp.org 2> >(logger)

  1. 运行ntpd -qnp pool.ntp.org
  2. 使用2>redirect它的stderr到…在哪里? 好….
  3. >(logger)
    1. 创build一个命名pipe道(见机制 ),称之为/dev/fd/pipe100
    2. 开始从该pipe道读取STDIN的进程logger
    3. 将名称/dev/fd/pipe100入命令中
  4. …因此运行ntpd -qnp pool.ntp.org 2> /dev/fd/pipe100
  5. …进程logger从该pipe道读取: logger < /dev/fd/pipe100

上面应该在bash中很好地工作。

不过,我试图明确使用“sh”来运行它,这会产生:

 script.sh: line 3: syntax error near unexpected token `>' 

所以,正如其他评论者指出的那样,你可能不会在这里使用bash。

事实上,Busybox默认使用Almquist Shell 。

很可能你有一个与/ bin / sh不同的shell比你的默认shell(可能是bash)

要检查尝试使用/ bin / sh ./yourscript运行脚本,或将与$ SHELL相同的shell放入脚本中

哪个shell用于/ bin / sh可能是依赖于分配的,如果您在Solaris上,则完全不同。