구문 오류 없이 Case 문에서 프로세스 대체를 어떻게 사용할 수 있나요?

구문 오류 없이 Case 문에서 프로세스 대체를 어떻게 사용할 수 있나요?

/etc/init.d/myfile에 서비스로 스크립트를 로드했습니다.

서비스를 시작하려고 하면 오류가 발생합니다.

/etc/init.d/myservice: 21: /etc/init.d/myservice: Syntax error: "(" unexpected

문제는 소스 명령의 프로세스 대체 <(와 관련된 것 같습니다. 다른 스크립트에서 이를 사용하여 문제 없이 기본 구성 파일에서 변수를 추출했지만 사례 문에서는 어떻게 만드는지 모르겠습니다. 작동합니다.

내 서비스에는 다음이 포함됩니다.

#!/bin/sh
#/etc/init.d/myservice

### BEGIN INIT INFO
# Provides:          myservice
# Required-Start:    $remote_fs $syslog $network
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: my service
# Description:       Start the myservice service
### END INIT INFO

case "$1" in
  start)
    # start processes
        # Import the following variables from config.conf: cfgfile, dir, bindir
        source <(grep myservice /opt/mysoftware/config.conf | grep -oP '.*(?= #)')
        if [ -f $cfgfile ]
        then
            echo "Starting myservice"
            /usr/bin/screen -U -d -m $bindir/myscript.sh $cfgfile
        else
            echo "myservice could not start because the file $cfgfile is missing"
        fi
    ;;
  stop)
    # kill processes
    echo "Stopping myservice"
    screen -ls | grep Detached | cut -d. -f1 | awk '{print $1}' | xargs kill
    ;;
  restart)
    # kill and restart processes
    /etc/init.d/myservice stop
    /etc/init.d/myservice start
    ;;
  *)
    echo "Usage: /etc/init.d/myservice {start|stop|restart}"
    exit 1
    ;;
esac

exit 0

config.conf 파일은 간단한 설명과 이를 사용하는 스크립트 이름이 포함된 변수 선언 목록입니다. 나는 주어진 스크립트에 필요한 변수만 얻기 위해 grep 필터를 사용합니다.

다음과 같습니다.

var1=value # path to tmp folder   myservice
var2=value # log file name        myservice script1.sh script2.sh
var3=value # prefix for log file  script1.sh script2.sh

참고: 하드코딩된 값 대신 구성 파일을 사용하여 시작하도록 변환하기 전까지는 서비스가 제대로 작동했습니다.

감사해요.

답변1

Bash, ksh93, zsh 및 기타 최근 쉘은 프로세스 대체( <(command)구문)를 지원하지만 이는 비표준 확장입니다. Dash( /bin/shUbuntu 시스템)는 이를 지원하지 않으며 /bin/shbash에서 호출할 때도 지원되지 않습니다.

bash를 사용할 수 있는 경우 스크립트의 첫 번째 줄을 예를 들어 #!/bin/bash.

[파일 시스템을 마운트할 수 있는 디렉터리에 bash가 포함된 시스템(예: /usr/local/bin일부 시스템)에서는 서비스를 시작하기 전에 파일 시스템을 사용할 수 있는지 확인해야 할 수 있습니다. ]

답변2

프로세스 대체바시즘, 하지만 당신의셰르본 라인#!/bin/sh. 이 구문은 /bin/shBash나 다른 쉘이 프로세스 대체를 지원 하지 않는 한 실제로 지원되지 않습니다.@markplotnick.

관련 정보