Como usar a substituição de processo em uma instrução case sem obter erros de sintaxe?

Como usar a substituição de processo em uma instrução case sem obter erros de sintaxe?

Tenho um script carregado como serviço em /etc/init.d/myfile

Quando tento iniciar o serviço recebo o erro

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

O problema parece estar na substituição do processo <( no comando source. Eu uso sem problemas em outros scripts para extrair variáveis ​​do meu arquivo de configuração principal, mas dentro de uma instrução case não sei como fazer funcionar.

meuserviço contém:

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

O arquivo config.conf é uma lista de declarações de variáveis ​​com uma breve descrição e o nome do script que as utiliza. Eu uso filtros grep para obter apenas as variáveis ​​necessárias para um determinado script.

Se parece com isso:

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

Nota: O serviço funcionou bem antes de convertê-lo para começar a usar o arquivo de configuração em vez de valores codificados.

Obrigado.

Responder1

Bash, ksh93, zsh e outros shells recentes suportam a substituição de processos (a <(command)sintaxe), mas é uma extensão não padrão. Dash (que está /bin/shem sistemas Ubuntu) não suporta isso, e bash quando invocado /bin/shtambém não.

Se você tiver o bash disponível, altere a primeira linha do seu script para, por exemplo, #!/bin/bash.

[Em sistemas que possuem bash em um diretório em um sistema de arquivos montável, como /usr/local/binem alguns sistemas, pode ser necessário certificar-se de que o sistema de arquivos esteja disponível antes de seu serviço ser iniciado.]

Responder2

Substituição de processoé umbashismo, mas o seulinha shebangé #!/bin/sh. A menos que /bin/shseja o Bash ou algum outro shell que suporte a substituição de processos, essa sintaxe de fato não é suportada, como apontado por@MarkPlotnick.

informação relacionada