在 shell 脚本中使用记录器

在 shell 脚本中使用记录器

如何在 shell 脚本中使用记录器?

如果我跑

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 脚本有什么错误?

答案1

shebang 是正确的,因为 #!/bin/sh 和 #!/bin/bash 都可以使用*,但是,IIRC,您应该使用管道而不是重定向记录器,因为它是一个程序而不是文件。

尝试这个脚本:


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

*如果您使用 #!/bin/sh 作为脚本,则它们应该符合 posix 标准,即可以在 solaris 和 AIX 上良好运行。如果您使用某些 bash 特定功能,则必须使用 #!/bin/bash,因为没有更多的可移植性。

答案2

问题在于你使用 bash-ism,而你的 hash-bang 却说/bin/sh。将其更改为#! /bin/bash,它就可以正常工作。

答案3

我实际上必须检查该行的作用ntpd -qnp pool.ntp.org 2> >(logger)

  1. 跑步ntpd -qnp pool.ntp.org
  2. 将其 stderr 重定向2>到...具体在哪里?嗯....
  3. >(logger)
    1. 创建一个命名管道(参见机制), 叫它/dev/fd/pipe100
    2. 启动logger从该管道读取其 STDIN 的进程
    3. 将名称替换/dev/fd/pipe100到命令中
  4. ...因此运行ntpd -qnp pool.ntp.org 2> /dev/fd/pipe100
  5. ...当进程logger从该管道读取时:logger < /dev/fd/pipe100

上述内容在 bash 中应该可以正常工作。

但是,我尝试明确使用“sh”来运行它,结果如下:

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

因此,正如其他评论者指出的那样,您可能没有在这里使用 bash。

事实上,Busybox 使用Almquist 外壳默认情况下。

答案4

最有可能的是,你的 /bin/sh shell 和你的默认 shell(可能是 bash)不同

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

/bin/sh 使用哪种 shell 可能取决于发行版,而且如果你使用的是 Solaris,那就完全不同了。

相关内容