El script de shell falla: error de sintaxis: "(" inesperado

64

He estado trabajando en un script que automatiza la configuración de un entorno de desarrollo para el desarrollo de Raspberry Pi (los detalles paso a paso que funcionan están aquí ). El script está vinculado en ese artículo, pero también puede encontrarlo aquí . Ahora, cuando ejecute este script, instale y configure el entorno sin error, pero debe ingresar su contraseña de sudo más de una vez debido al valor de tiempo de espera de sudo de forma predeterminada. Así que comencé a experimentar eliminando todas las líneas de sudo y ejecutando todo el script a través de sudo en la línea de comando de esta manera:

kemra102@ubuntuvm:~$ sudo ./pi_dev_env_install.sh

Esto funciona bien como se esperaba y llega hasta este punto:

./pi_dev_env_install: 68: ./pi_dev_env_install.sh: Syntax error: "(" unexpected

Ahora esta línea funcionó bien anteriormente cuando no se ejecutaba todo el script con sudo. No hay nada acerca de que esta línea se ejecute como sudo que deba dejar de funcionar, que yo sepa, ¿alguien tiene alguna idea?

kemra102
fuente
1
¿El shebang está realmente en la línea 9? Debido a la afinidad DashAsBinSh de Ubuntu, sospecho que su script se interpreta en dashlugar de bash. Trate de mover el shebang en la línea 1.
manatwork
De acuerdo con ese artículo, llamar a / bin / bash directamente en lugar de / bin / sh will; use correctamente bash en lugar de guión para que no sea un problema tal como lo entiendo. Todavía puedo mover el shebang, por supuesto, pero eso realmente no explica por qué funciona cuando no sudo todo el guión.
kemra102
En mi caso, todo estaba bien, pero como costumbre, estaba ejecutando mi script de shell con "sh", no con "bash".
Indrajeet Gour

Respuestas:

82

El script no comienza con una línea shebang , por lo que el sistema lo ejecuta con /bin/sh. En Ubuntu, /bin/shes dash , un shell diseñado para un inicio y ejecución rápidos con solo características estándar. Cuando el guión llega a la línea 68, ve un error de sintaxis: ese paréntesis no significa nada en contexto.

Como dash (como todos los demás shells) es un intérprete, no se quejará hasta que la ejecución llegue a la línea problemática. Por lo tanto, incluso si el script se iniciara con éxito en algún momento de la prueba, se habría cancelado una vez que se alcanzara la línea 68.

La línea shebang debe ser lo primero en el archivo. Como utiliza las funciones bash, la primera línea del archivo debe ser #!/bin/basho #!/usr/bin/env bash.

Gilles 'SO- deja de ser malvado'
fuente
2
Gracias claramente por un vacío en mi conocimiento, no escribo mucho, ¡así que no estaba al tanto de eso! Gracias por la explicación, ha ayudado mucho y será muy útil saberlo en el futuro también.
kemra102
Permítanme agregar que este error ocurre incluso al usar la extensión de scripts para nautilus. Agregar la línea shebang lo resolvió de inmediato. +1.
Bhavin Doshi
Frente al problema que se ejecuta sonarqube.shen Ubuntu 15.10. Cambió el encabezado como se dijo. Ejecutando sudo sh ./sonar.sh console. Aún obteniendo el error.
soufrk
@soufrk ¿Es sonarqube.sho sonar.sh? Decídete. Y de todos modos, si no puede resolver el problema con la información en este hilo, haga una nueva pregunta con el contenido completo de la secuencia de comandos y copie y pegue los mensajes de error completos.
Gilles 'SO- deja de ser malvado'
Culpa mía !! Estaba ejecutando un archivo ejecutable incorrecto. Pero curiosamente, en el arco correcto, el archivo comienza a #! /bin/shejecutarse perfectamente. Ahora, eso me deja perplejo.
soufrk
6

Si el shebang no está en la primera línea, no se respetará, independientemente del shell del usuario raíz, la SHELLvariable o el -sindicador. Puede confirmar fácilmente esto con un simple ejemplo:

#
#!/bin/bash
offfset=(`ls`)
echo $offset

Ejecutar este script con sudo generará un error de sintaxis en versiones recientes de Ubuntu y Debian.

Tiene dos opciones para asegurarse de que el guión sea interpretado por bash:

  1. Mueve el shebang a la primera línea

  2. Corre sudoasí:

    sudo bash ./pi_dev_env_install.sh
janos
fuente
1

Para mí comenzar script con:

bash ./< script file > 

funciona bien.

my.coolmac
fuente
Eso puede ser cierto para usted, pero en realidad no es una solución al problema planteado.
bu5hman
0

Quizás tenga un "(" en el directorio o nombre de archivo.

mauro
fuente
0

Prueba dos2unix en el archivo de script. A veces hay algunos caracteres ocultos en la fuente.

mando:

dos2unix script_file.sh script_file.sh
M. Sarfraz
fuente
0

Esto puede suceder si anula el intérprete previsto. Por ejemplo, esto se ejecutará con sh independientemente de qué hash bang se use (útil cuando no se usa hash bang):

> sh run.sh

O para ejecutar bash:

> bash run.sh

Para dejar que use el valor de hash bang definido por el script, use esto:

> ./run.sh
Kc Gibson
fuente
-1
sudo chmod 755 <script>

En mi caso, el error fue la falta de permisos para ejecutar el archivo. Solo recibí el mensaje de error cuando separé los comandos:

$ sudo sh
# ./install
usuario145114
fuente
La falta de permisos no causaría este mensaje de error.
Gilles 'SO- deja de ser malvado'