¿Cómo utilizar la sustitución de procesos dentro de una declaración de caso sin obtener errores de sintaxis?

¿Cómo utilizar la sustitución de procesos dentro de una declaración de caso sin obtener errores de sintaxis?

Tengo un script cargado como servicio en /etc/init.d/myfile

Cuando intento iniciar el servicio me sale el error

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

El problema parece estar en la sustitución del proceso <( en el comando fuente. Lo uso sin ningún problema en otros scripts para extraer variables de mi archivo de configuración principal, pero dentro de una declaración de caso no sé cómo hacerlo funcionar.

miservicio contiene:

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

El archivo config.conf es una lista de declaraciones de variables con una breve descripción y el nombre del script que las utiliza. Utilizo filtros grep para obtener solo las variables que necesito para un script determinado.

Se parece a esto:

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: El servicio funcionó bien antes de convertirlo para comenzar a usar el archivo de configuración en lugar de valores codificados.

Gracias.

Respuesta1

Bash, ksh93, zsh y otros shells recientes admiten la sustitución de procesos (la <(command)sintaxis), pero es una extensión no estándar. Dash (que está /bin/shen los sistemas Ubuntu) no lo admite, y bash cuando se invoca /bin/shtampoco lo admite.

Si tiene bash disponible, cambie la primera línea de su script a, por ejemplo, #!/bin/bash.

[En sistemas que tienen bash en un directorio en un sistema de archivos montable, como /usr/local/binen algunos sistemas, es posible que deba asegurarse de que el sistema de archivos esté disponible antes de iniciar el servicio.]

Respuesta2

Sustitución de procesoses unbashismo, Pero tulínea shebanges #!/bin/sh. A menos que /bin/shsea Bash o algún otro shell que admita la sustitución de procesos, esa sintaxis de hecho no es compatible, como lo señala@MarkPlotnick.

información relacionada