![我在 shell 脚本中收到“意外标记附近的语法错误”错误](https://linux22.com/image/90065/%E6%88%91%E5%9C%A8%20shell%20%E8%84%9A%E6%9C%AC%E4%B8%AD%E6%94%B6%E5%88%B0%E2%80%9C%E6%84%8F%E5%A4%96%E6%A0%87%E8%AE%B0%E9%99%84%E8%BF%91%E7%9A%84%E8%AF%AD%E6%B3%95%E9%94%99%E8%AF%AF%E2%80%9D%E9%94%99%E8%AF%AF.png)
当我在控制台中运行特定命令时,它工作正常,但是当我使用启动脚本运行时......它会抛出错误。
#!/bin/bash
# chkconfig: 2345 20 80
# description: Description comes here....
# Source function library.
. /etc/init.d/functions
start() {
# code to start app comes here
# example: daemon program_name &
daemon /root/amr/bin/LoggerServer &
daemon /root/amr/bin/mediaController -i 192.168.117.119 &
daemon /root/amr/bin/mstdaemon --daemon
daemon /root/amr/bin/pcdaemon --daemon -i ens192 -f "udp && portrange 3000-8000 && not(src host localhost)" &
daemon /root/amr/bin/stund &
daemon /root/amr/bin/tdaemon &
#/root/amr/bin/start.sh &
}
stop() {
# code to stop app comes here
# example: killproc program_name
killproc LoggerServer
killproc mediaController
killproc mstdaemon
killproc pcdaemon
killproc stund
killproc tdaemon
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
status)
# code to check status of app comes here
# example: status program_name
status LoggerServer
status mediaController
status mstdaemon
status pcdaemon
status stund
status tdaemon
;;
*)
echo "Usage: $0 {start|stop|status|restart}"
esac
exit 0
错误 :
/bin/bash: -c: line 0: syntax error near unexpected token `src'
/bin/bash: -c: line 0: `ulimit -S -c 0 >/dev/null 2>&1 ; /root/amr/bin/pcdaemon --daemon -i ens192 -f udp && portrange 3000-8000 && not(src host localhost)'
命令行运行:./pcdaemon --daemon -i ens192 -f "udp && portrange 3000-8000 && not(src host localhost)"
答案1
/etc/init.d/functions
在旧的 CentOS 系统上查看内部,该daemon
函数有效地运行
/bin/bash -c "[...] ; $*"
$*
扩展到到函数的参数,用空格分隔,有效地丢失了“udp ... localhost)”周围的额外引号。结果被提供给一个新的 shell,它会看到以下内容:
/root/amr/bin/pcdaemon --daemon -i ens192 -f udp && portrange 3000-8000 && not(src host localhost)
并将其作为命令行运行。这&&
是不是此时被引用,因此它由 shell 解释,其中的foo && bar
意思是“运行 foo,然后如果成功,则运行 bar”。当它发生时,not(src...
会触发语法错误,因此不会运行任何内容。将 更改not
为 a!
不会有帮助,因为即使它消除了语法错误,shell 现在也会pcdaemon
在参数被截断的情况下运行,然后尝试运行名为 的程序portrange
。
除了让 Red Hat 修复脚本之外,您还可以通过将命令pcdaemon
行放入自己的脚本中来解决此问题(如建议的那样)
马克·普洛特尼克),或添加另一组引号。对于当前的daemon
功能,我认为这应该有效:
daemon /root/amr/bin/pcdaemon --daemon -i ens192 -f "'udp && portrange 3000-8000 && not(src host localhost)'"
(尽管如果有人真正修复了这个daemon
函数,那么这会给 提供额外的引号pcdaemon
。)