Как использовать подстановку процесса в операторе case, не получая синтаксических ошибок?

Как использовать подстановку процесса в операторе case, не получая синтаксических ошибок?

У меня есть скрипт, загруженный как служба в /etc/init.d/myfile

Когда я пытаюсь запустить службу, я получаю ошибку

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

Проблема, по-видимому, связана с заменой процесса <( в исходной команде. Я без проблем использую его в других скриптах для извлечения переменных из моего основного файла конфигурации, но внутри оператора case я не знаю, как заставить его работать.

мойсервис содержит:

#!/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/shв системах Ubuntu) не поддерживает его, и bash, когда вызывается как /bin/sh, тоже не поддерживает.

Если у вас есть bash, измените первую строку скрипта, например, на #!/bin/bash.

[В системах, где bash находится в каталоге монтируемой файловой системы, например /usr/local/binв некоторых системах, вам может потребоваться убедиться, что файловая система доступна, прежде чем запускать службу.]

решение2

Процесс заменыэтобашизм, но твойлиния шебанга#!/bin/shЕсли только Bash /bin/shили какая-либо другая оболочка не поддерживает замену процессов, этот синтаксис действительно не поддерживается, как указано@МаркПлотник.

Связанный контент