Problema con lo script Bash: 'dichiara: non trovato'


23

Avevo una sceneggiatura che funzionava bene ma quando l'ho eseguita oggi, dice declare: not found. Sto usando bash shell e il percorso all'inizio dello script è corretto.

Due righe contrassegnate nel mio script sono le seguenti:

declare -a RESPONSE
RESPONSE=($RESULT)

Dice anche che (è inaspettato ma immagino che stia arrivando a causa del primo errore. Vale la pena ricordare che quando scrivo dichiama direttamente funziona bene.

declare | grep USER Spettacoli

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

Allora, cosa c'è che non va qui?

Risposte:


27

Stai usando shinvece di bash? sh(collegato a dash) non supporta la declareparola chiave, né la sintassi

VAR=(list) 

per inizializzare le matrici.


La mia linea Shebang è #!/bin/bashsolo. Intendevi come lo eseguo? Ho appena provato a eseguirlo ./script.she ha funzionato. Ma non funziona come script.sho sh script.she sono praticamente sicuro di usare solo gli ultimi due metodi mentre l'ho creato una settimana fa. Cosa potrebbe spiegarlo?
Ashfame,

@Ashfame: forse una settimana fa ha perso le funzionalità specifiche di bash che hai ora, quindi ha funzionato anche con sh script.sh
enzotib

No, intendevo esattamente questo script funzionava una settimana o due settimane fa. O volevi dire che qualche aggiornamento potrebbe aver apportato una modifica?
Ashfame,

@Ashfame: Non lo so, questo script, come lo mostri ora, non può funzionare con sh script.sh.
enzotib,

11

Ho il sospetto che la tua riga "shebang" (la prima riga facoltativa del file) faccia riferimento shinvece di bash. Dovrebbe essere

#!/bin/bash

per gli script bash. Se la prima riga del tuo script è

#!/bin/sh

allora ciò indicherebbe che deve essere usata una shell strettamente compatibile con Bourne; nel caso di Ubuntu, dashviene utilizzato. In molte altre distribuzioni, ciò non causa problemi, poiché si collegano /bin/sha /bin/bash; tuttavia Ubuntu si collega per /bin/dashconsentire agli script di sistema di essere eseguiti più rapidamente.

Il declarebuiltin è una delle bashmolte estensioni alla specifica dello script della shell Bourne; dashimplementa tale specifica senza estensioni.


La mia linea shebang è #!/bin/bashsolo
Ashfame,

@Ashfame: come stai eseguendo lo script? Se lo stai invocando semplicemente digitando il nome dello script, la riga shebang determinerà quale interprete lo esegue. Tuttavia, se lo invochi esplicitamente tramite sh thescript.sh, la shshell - cioè dashlo interpreterà.
intuito il

1
@intuited, lo stavo attraversando sh script.sh. Capisco quello che hai detto, ma ho letto da qualche parte che con questo metodo bashlo interpreterò. Perché dovrebbe dashottenere il ruolo qui? È solo con Ubuntu? Potrebbe essere quello che ho letto per Linux in generale.
Ashfame,

2
@Ashfame con sh scriptte sta eseguendo il comando shcon l'argomento script, il che rende sh read ed esegue i comandi in quel file. Lo shebang non viene letto da sh, inizia con un #, quindi viene trattato come un commento. Se invece esegui ./script, il kernel leggerà lo shebang, che nel tuo caso lo è #!/bin/bash, e quindi viene eseguito/bin/bash ./script
geirha,

@geirha sì è così che so che funziona, ma @intuited menzione che dashverrà utilizzata, quindi devo chiarirlo
Ashfame

3

Come riprodurre l'errore sopra riportato:

Sto usando Ubuntu 14.04 64 bit. Inserisci questo codice in un file:

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

Eseguilo in questo modo:

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

Per risolverlo, fai invece questo:

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

stampe:

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

1

Ho avuto lo stesso problema, e poi ho ricordato che è necessario assegnare le autorizzazioni giuste per eseguire lo script della shell.

Modifica l'autorizzazione dello script, ad esempio:

chmod 755 script.sh

1

Prova a eseguire lo script utilizzando /bin/bashnella riga di comando invece se sh(:

Invece di :

    sh script.sh

Provare :

    / bin / bash script.sh

1

Su Ubuntu, potresti avere uno script che sta eseguendo altri script al suo interno, in cui mi sono imbattuto.

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 tutto sh some_script.shper $SHELL some_script.shrisolverlo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.