Problema com o script Bash: 'declare: not found'


23

Eu tinha um script que estava funcionando bem, mas quando o executei hoje, ele diz declare: not found. Estou usando o shell bash e o caminho no início do script está correto.

Duas linhas sinalizadas no meu script são as seguintes:

declare -a RESPONSE
RESPONSE=($RESULT)

Também diz que (é inesperado, mas acho que está chegando por causa do primeiro erro. Vale mencionar que é quando eu digito declarar que funciona diretamente bem.

declare | grep USER mostra

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

Então, o que há de errado aqui?

Respostas:


27

Você está usando em shvez de bash? sh(vinculado a dash) não suporta declarepalavras-chave nem a sintaxe

VAR=(list) 

para inicializar matrizes.


Minha linha shebang é #!/bin/bashapenas. Você quis dizer como eu o executo? Eu apenas tentei executá-lo como ./script.she funcionou. Mas ele não funciona como script.shou sh script.she estou bastante certo de que eu costumava usar apenas os dois últimos métodos, enquanto eu o criei uma semana atrás. O que poderia explicar isso?
Ashfame 27/02

@Ashfame: talvez uma semana atrás ele perdeu a recursos específicos para bater você tem agora, para que também trabalhou com script.sh sh
enzotib

Não, eu quis dizer exatamente esse script costumava funcionar uma ou duas semanas atrás. Ou você quis dizer que alguma atualização pode ter sido alterada?
Ashfame 27/02

@ Ashfame: Eu não sei, esse script, como você mostra agora, não pode funcionar com sh script.sh.
enzotib 27/02

11

Eu suspeito que sua linha "shebang" (a primeira linha opcional do arquivo) esteja shfazendo referência a ele bash. Deveria ser

#!/bin/bash

para scripts bash. Se a primeira linha do seu script for

#!/bin/sh

isso indicaria que um invólucro estritamente compatível com bourne deve ser usado; no caso do Ubuntu, dashé usado. Em muitas outras distribuições, isso não causa um problema, porque eles se vinculam /bin/sha /bin/bash; no entanto, o ubuntu se conecta a /bin/dashfim de permitir que os scripts do sistema sejam executados mais rapidamente.

O declarebuiltin é uma das bashmuitas extensões da especificação de script de shell Bourne; dashapenas implementa essa especificação sem extensões.


Minha linha de shebang é #!/bin/bashapenas #
2727 Ashfame

@ Ashfame: como você está executando o script? Se você o estiver chamando apenas digitando o nome do script, a linha shebang determinará qual intérprete o executa. No entanto, se você invocá-lo explicitamente via sh thescript.sh, o shshell - ou seja, dashirá interpretá-lo.
intuited

1
@intuited Eu estava passando por isso sh script.sh. Entendo o que você disse, mas li em algum lugar que, com esse método, basho interpretará. Por que dashconseguiria esse papel aqui? É apenas com o Ubuntu? Pode ser o que eu li foi para linux em geral.
Ashfame 27/02

2
@Shshame com sh scriptvocê está executando o comando shcom o argumento script, o que faz sh ler e executar os comandos nesse arquivo. O shebang não é lido por sh, ele começa com a #, por isso é tratado como um comentário. Se você em vez executado ./script, então o kernel irá ler o shebang, que no seu caso é #!/bin/bash, e assim ele executa/bin/bash ./script
geirha

@geirha sim isso é como eu sei que funciona, mas menção @intuited que dashserá usado, então eu preciso esclarecer isso
Ashfame

3

Como reproduzir o erro acima:

Estou usando o Ubuntu 14.04 de 64 bits. Coloque este código em um arquivo:

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

Execute-o assim:

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

Para corrigi-lo, faça o seguinte:

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

Impressões:

el@apollo:~$ ./06.sh 
12

1

Eu tive o mesmo problema e lembrei-me de que você precisa atribuir as permissões corretas para executar o shell script.

Altere a permissão do script, por exemplo:

chmod 755 script.sh

1

Tente executar seu script usando /bin/bashna linha de comando, se sh(:

Ao invés de :

    sh script.sh

Experimentar :

    / bin / bash script.sh

1

No Ubuntu, você pode ter um script que esteja executando outros scripts nele, nos quais eu encontrei.

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"

Alterando tudo sh some_script.shpara $SHELL some_script.shcorrigi-lo.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.