我怎样才能在一个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)
:
ntpd -qnp pool.ntp.org
2>
redirect它的stderr到…在哪里? 好…. >(logger)
/dev/fd/pipe100
logger
/dev/fd/pipe100
入命令中 ntpd -qnp pool.ntp.org 2> /dev/fd/pipe100
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上,则完全不同。