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?
#!/bin/bash
apenas. Você quis dizer como eu o executo? Eu apenas tentei executá-lo como./script.sh
e funcionou. Mas ele não funciona comoscript.sh
oush script.sh
e 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?Eu suspeito que sua linha "shebang" (a primeira linha opcional do arquivo) esteja
sh
fazendo referência a elebash
. Deveria serpara scripts bash. Se a primeira linha do seu script for
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/sh
a/bin/bash
; no entanto, o ubuntu se conecta a/bin/dash
fim de permitir que os scripts do sistema sejam executados mais rapidamente.O
declare
builtin é uma dasbash
muitas extensões da especificação de script de shell Bourne;dash
apenas implementa essa especificação sem extensões.fonte
#!/bin/bash
apenas #sh thescript.sh
, osh
shell - ou seja,dash
irá interpretá-lo.sh script.sh
. Entendo o que você disse, mas li em algum lugar que, com esse método,bash
o interpretará. Por quedash
conseguiria esse papel aqui? É apenas com o Ubuntu? Pode ser o que eu li foi para linux em geral.sh script
você está executando o comandosh
com o argumentoscript
, 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
dash
será usado, então eu preciso esclarecer issoComo reproduzir o erro acima:
Estou usando o Ubuntu 14.04 de 64 bits. Coloque este código em um arquivo:
Execute-o assim:
Para corrigi-lo, faça o seguinte:
Impressões:
fonte
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:
fonte
Tente executar seu script usando
/bin/bash
na linha de comando, sesh
(:Ao invés de :
Experimentar :
fonte
No Ubuntu, você pode ter um script que esteja executando outros scripts nele, nos quais eu encontrei.
Alterando tudo
sh some_script.sh
para$SHELL some_script.sh
corrigi-lo.fonte