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?
fuente
dash
lugar debash
. Trate de mover el shebang en la línea 1.Respuestas:
El script no comienza con una línea shebang , por lo que el sistema lo ejecuta con
/bin/sh
. En Ubuntu,/bin/sh
es 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/bash
o#!/usr/bin/env bash
.fuente
sonarqube.sh
en Ubuntu 15.10. Cambió el encabezado como se dijo. Ejecutandosudo sh ./sonar.sh console
. Aún obteniendo el error.sonarqube.sh
osonar.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.#! /bin/sh
ejecutarse perfectamente. Ahora, eso me deja perplejo.Si el shebang no está en la primera línea, no se respetará, independientemente del shell del usuario raíz, la
SHELL
variable o el-s
indicador. Puede confirmar fácilmente esto con un simple ejemplo: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
:Mueve el shebang a la primera línea
Corre
sudo
así:fuente
Para mí comenzar script con:
funciona bien.
fuente
Quizás tenga un "(" en el directorio o nombre de archivo.
fuente
Prueba dos2unix en el archivo de script. A veces hay algunos caracteres ocultos en la fuente.
mando:
fuente
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):
O para ejecutar bash:
Para dejar que use el valor de hash bang definido por el script, use esto:
fuente
En mi caso, el error fue la falta de permisos para ejecutar el archivo. Solo recibí el mensaje de error cuando separé los comandos:
fuente