Problema con el script Bash: 'declarar: no encontrado'

23

Tenía un script que funcionaba bien, pero cuando lo ejecuté hoy, dice declare: not found. Estoy usando bash shell y la ruta al comienzo del script es correcta.

Dos líneas marcadas en mi script son las siguientes:

declare -a RESPONSE
RESPONSE=($RESULT)

También dice que (es inesperado, pero supongo que está surgiendo debido al primer error. Vale la pena mencionar que cuando escribo declarar directamente funciona bien.

declare | grep USER muestra

USER=ashfame
USERNAME=ashfame
           values="$SVN_BASH_USERNAME";

Entonces, ¿qué pasa aquí?

Ashfame
fuente

Respuestas:

27

¿Estás usando en shlugar de bash? sh(vinculado a dash) no admite declarepalabras clave, ni la sintaxis

VAR=(list) 

para inicializar matrices.

enzotib
fuente
Mi línea shebang es #!/bin/bashúnica. ¿Querías decir cómo lo ejecuto? Solo intenté ejecutarlo como ./script.shy funcionó. Pero no funciona como script.sho sh script.shy estoy bastante seguro de que solía usar solo los dos últimos métodos mientras lo creé hace una semana. ¿Qué podría explicar eso?
Ashfame
@Ashfame: quizás hace una semana faltó las características específicas de bash que tienes ahora, por lo que funcionó también con sh script.sh
enzotib
No, quise decir exactamente que este script solía funcionar hace una o dos semanas. ¿O quisiste decir que alguna actualización podría haber hecho un cambio?
Ashfame
@Ashfame: No sé, este script, como lo muestra ahora, no puede funcionar con sh script.sh.
enzotib
11

Sospecho que su línea "shebang" (la primera línea opcional del archivo) hace referencia en shlugar de bash. Debería ser

#!/bin/bash

para guiones bash. Si la primera línea de tu script es

#!/bin/sh

entonces eso indicaría que se debe utilizar un shell estrictamente compatible con bourne; en el caso de Ubuntu, dashse usa. En muchas otras distribuciones, esto no causa un problema, ya que se vinculan /bin/sha /bin/bash; sin embargo, ubuntu se enlaza para /bin/dashpermitir que los scripts del sistema se ejecuten más rápidamente.

El declareincorporado es una de bashlas muchas extensiones de la especificación de script de shell Bourne; dashsolo implementa esa especificación sin extensiones.

intuido
fuente
Mi línea shebang es #!/bin/bashsolo
Ashfame
@Ashfame: ¿cómo estás ejecutando el script? Si lo invoca simplemente escribiendo el nombre del script, la línea shebang determinará qué intérprete lo ejecuta. Sin embargo, si lo invocas explícitamente a través de sh thescript.sh, el shshell, es decir, dashlo interpretará.
intuido
1
@intuited Lo estaba revisando sh script.sh. Entiendo lo que dijiste, pero he leído en alguna parte que con este método bashlo interpretarás. ¿Por qué dashconseguirlo aquí? ¿Es solo con Ubuntu? Puede ser lo que leí para Linux en general.
Ashfame
2
@Ashfame con sh scriptusted está ejecutando el comando shcon el argumento script, lo que hace que sh lea y ejecute los comandos en ese archivo. El shebang no se lee por sh, comienza con un #, por lo que se trata como un comentario. Si, en su lugar ./script, ejecuta , el núcleo leerá el shebang, que en su caso es #!/bin/bash, y así se ejecuta/bin/bash ./script
geirha
@geirha sí, así es como sé que funciona, pero @intuited menciona que dashse usará, así que necesito aclararlo
Ashfame
3

Cómo reproducir el error anterior:

Estoy usando Ubuntu 14.04 de 64 bits. Pon este código en un archivo:

#!/bin/sh 
declare -i FOOBAR=12; 
echo $FOOBAR; 

Ejecútelo así:

el@apollo:~$ ./06.sh 
./test.sh: 2: ./test.sh: declare: not found

Para solucionarlo, haga esto en su lugar:

#!/bin/bash
declare -i FOOBAR=12;
echo $FOOBAR;

Huellas dactilares:

el@apollo:~$ ./06.sh 
12
Eric Leschinski
fuente
1

Tuve el mismo problema, y ​​luego recordé que debes asignar los permisos correctos para ejecutar el script de shell.

Cambiar el permiso del script, por ejemplo:

chmod 755 script.sh
Edgard Padilla
fuente
1

Intente ejecutar su script usando la /bin/bashlínea de comando en su lugar si sh(:

En lugar de :

    sh script.sh

Tratar :

    / bin / bash script.sh
Caminar
fuente
1

En Ubuntu, puede tener un script que está ejecutando otros scripts dentro de él, con los que me he encontrado.

some_dir/  
        | main.sh  
        | shhh.sh

#!/bin/bash -e

echo "file? $0"
# file? ./main.sh

echo "shell? $SHELL" 
# shell? /bin/bash

# sh shhh.sh
# file? shhh.sh
# shell? /bin/bash
# shhh.sh: 5: shhh.sh: declare: not found

$SHELL shhh.sh
# file? shhh.sh
# shell? /bin/bash
# foo? bar

#!/bin/bash -e

echo "file? $0"
# shhh.sh

echo "shell? $SHELL"
# shell? /bin/bash

declare foo="bar"

echo "foo? $foo"

Cambiando todo sh some_script.shpara $SHELL some_script.sharreglarlo.

Rahman Malik
fuente