我在 shell 脚本中收到“意外标记附近的语法错误”错误

我在 shell 脚本中收到“意外标记附近的语法错误”错误

当我在控制台中运行特定命令时,它工作正常,但是当我使用启动脚本运行时......它会抛出错误。

#!/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。)

相关内容