如何在 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)
:
- 跑步
ntpd -qnp pool.ntp.org
- 将其 stderr 重定向
2>
到...具体在哪里?嗯.... >(logger)
- 创建一个命名管道(参见机制), 叫它
/dev/fd/pipe100
- 启动
logger
从该管道读取其 STDIN 的进程 - 将名称替换
/dev/fd/pipe100
到命令中
- 创建一个命名管道(参见机制), 叫它
- ...因此运行
ntpd -qnp pool.ntp.org 2> /dev/fd/pipe100
- ...当进程
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,那就完全不同了。