Problem mit dem Bash-Skript: 'declare: not found'

22

Ich hatte ein Skript, das gut lief, aber als ich es heute lief, heißt es declare: not found. Ich benutze die Bash-Shell und der Pfad zu Beginn des Skripts ist korrekt.

Zwei markierte Zeilen in meinem Skript lauten wie folgt:

declare -a RESPONSE
RESPONSE=($RESULT)

Es heißt auch, dass (es unerwartet ist, aber ich vermute, dass dies auf den ersten Fehler zurückzuführen ist. Erwähnenswert ist, wenn ich deklariere, dass es direkt funktioniert.

declare | grep USER zeigt an

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

Also, was ist hier falsch?

Ashfame
quelle

Antworten:

26

Verwenden Sie shstatt bash? sh(verknüpft mit dash) unterstützt weder das declareSchlüsselwort noch die Syntax

VAR=(list) 

zum Initialisieren von Arrays.

Enzotib
quelle
Meine Shebang Linie ist #!/bin/bashnur. Meinten Sie, wie ich es ausführen? Ich habe gerade versucht, es auszuführen, ./script.shund es hat funktioniert. Aber es funktioniert nicht wie script.shoder sh script.shund ich bin ziemlich sicher, dass ich nur die letzten beiden Methoden verwendet habe, als ich es vor einer Woche erstellt habe. Was könnte das erklären?
Ashfame
@Ashfame: Vor einer Woche fehlten vielleicht die spezifischen Funktionen für Bash, die Sie jetzt haben, und so funktionierte es auch mit sh script.sh
enzotib
Nein, genau dieses Skript hat vor einer oder zwei Wochen funktioniert. Oder meintest du, dass ein Update eine Änderung vorgenommen hat?
Ashfame
@Ashfame: Ich weiß nicht, dass dieses Skript, wie Sie es jetzt zeigen, nicht mit sh script.sh funktionieren kann.
Enzotib
11

Ich vermute , dass Ihre „shebang“ Linie (die optionale erste Zeile der Datei) verweist shstatt bash. Es sollte sein

#!/bin/bash

für Bash-Skripte. Wenn die erste Zeile Ihres Skripts ist

#!/bin/sh

dann würde dies anzeigen, dass eine streng Borowski-kompatible Shell verwendet werden soll; im Falle von Ubuntu dashwird verwendet. In vielen anderen Distributionen ist dies ein Problem nicht verursachen, weil sie verbinden /bin/shzu /bin/bash; Ubuntu stellt jedoch eine Verknüpfung zu her /bin/dash, damit Systemskripten schneller ausgeführt werden können.

Das declareBuiltin ist eine der bashvielen Erweiterungen der Bourne-Shell-Skriptspezifikation. dashimplementiert nur diese Spezifikation ohne Erweiterungen.

intuitiert
quelle
Meine Shebang-Linie ist #!/bin/bashnur
Ashfame
@ Ashfame: Wie läuft das Skript? Wenn Sie es aufrufen, indem Sie einfach den Namen des Skripts eingeben, bestimmt die shebang-Zeile, welcher Interpreter es ausführt. Wenn Sie es jedoch explizit über aufrufen sh thescript.sh, interpretiert die shShell dashes.
Intuited
1
@intuited Ich habe es durchlaufen sh script.sh. Ich verstehe, was Sie gesagt haben, aber ich habe irgendwo gelesen, dass mit dieser Methode, bashes interpretieren wird. Warum sollte dashes hier eine Rolle spielen? Geht das nur mit Ubuntu? Vielleicht war das, was ich las, für Linux im Allgemeinen.
Ashfame
2
@Ashfame mit sh scriptIhnen führt den Befehl shmit dem Argument aus script, wodurch sh die Befehle in dieser Datei liest und ausführt. Der Shebang wird von sh nicht gelesen, er beginnt mit einem #, wird also als Kommentar behandelt. Wenn Sie stattdessen ausführen ./script, liest der Kernel den Shebang, der in Ihrem Fall ist #!/bin/bash, und führt ihn aus/bin/bash ./script
geirha
@geirha ja das ist, wie ich weiß, dass es funktioniert, aber @intuited Erwähnung, dashdie verwendet wird, so muss ich es klären
Ashfame
3

So reproduzieren Sie den obigen Fehler:

Ich benutze Ubuntu 14.04 64 Bit. Fügen Sie diesen Code in eine Datei ein:

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

Führen Sie es so aus:

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

Führen Sie stattdessen die folgenden Schritte aus, um das Problem zu beheben:

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

Drucke:

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

Ich hatte das gleiche Problem, und dann erinnerte ich mich, dass Sie die richtigen Berechtigungen zuweisen müssen, um das Shell-Skript auszuführen.

Ändern Sie die Berechtigung des Skripts, zum Beispiel:

chmod 755 script.sh
Edgard Padilla
quelle
1

Versuchen Sie /bin/bashstattdessen , Ihr Skript über die Befehlszeile auszuführen, wenn sh(:

Anstatt :

    sh script.sh

Versuchen :

    / bin / bash script.sh
Gehen
quelle
1

Unter Ubuntu haben Sie möglicherweise ein Skript, das andere Skripte ausführt, auf die ich gestoßen bin.

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"

Ändern Sie alles, sh some_script.shum $SHELL some_script.shes zu beheben.

Rahman Malik
quelle