쉘 스크립트에서 "예기치 않은 토큰 근처의 구문 오류" 오류가 발생합니다.

쉘 스크립트에서 "예기치 않은 토큰 근처의 구문 오류" 오류가 발생합니다.

콘솔에서 특정 명령을 실행하면 제대로 작동하지만 시작 스크립트를 사용하여 실행하면... 오류가 발생합니다.

#!/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)" 주위의 추가 따옴표가 사실상 손실됩니다. 결과는 다음을 확인하는 새 셸에 제공됩니다.

/root/amr/bin/pcdaemon --daemon -i ens192 -f udp && portrange 3000-8000 && not(src host localhost)

명령줄로 실행해 보세요. 이것은&&아니요foo && bar이 시점에서 인용되어 쉘에서는 "foo를 실행하고 성공하면 bar를 실행하십시오"라는 의미로 해석됩니다 . 이 경우 not(src...구문 오류가 발생하므로 아무 것도 실행되지 않습니다. a not로 변경하면 !구문 오류가 제거되더라도 이제 셸은 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.)

관련 정보