Shell-Skript schlägt fehl: Syntaxfehler: "(" unerwartet

64

Ich habe an einem Skript gearbeitet, das das Einrichten einer Entwicklungsumgebung für die Raspberry Pi-Entwicklung automatisiert (Schritt für Schritt Details, die hier funktionieren ). Das Skript ist in diesem Artikel verlinkt, aber der Einfachheit halber finden Sie es auch hier . Wenn Sie dieses Skript jetzt ausführen, installieren und konfigurieren Sie die Umgebung ohne Fehler, aber Sie müssen Ihr sudo-Passwort mehrmals eingeben, da das Zeitlimit von sudo standardmäßig überschritten ist. Also begann ich zu experimentieren, indem ich alle sudo-Zeilen entfernte und das gesamte Skript über sudo in der Befehlszeile wie folgt ausführte:

kemra102@ubuntuvm:~$ sudo ./pi_dev_env_install.sh

Dies funktioniert wie erwartet und macht den größten Teil bis zu diesem Punkt durch:

./pi_dev_env_install: 68: ./pi_dev_env_install.sh: Syntax error: "(" unexpected

Nun, diese Zeile funktionierte zuvor einwandfrei, wenn nicht das gesamte Skript mit sudo ausgeführt wurde. Es gibt nichts an dieser Zeile, das als sudo ausgeführt wird, was meines Wissens daran hindern sollte, zu funktionieren. Hat jemand irgendwelche Ideen?

kemra102
quelle
1
Der Shebang ist wirklich in Zeile 9? Aufgrund der DashAsBinSh- Affinität von Ubuntu vermute ich, dass Ihr Skript von dashstatt von interpretiert wird bash. Versuchen Sie, den Shebang in Zeile 1 zu verschieben.
Handarbeit
Nach diesem Artikel wird / bin / bash direkt anstelle von / bin / sh aufgerufen; Verwende Bash statt Bindestrich richtig, damit es kein Problem gibt, wie ich es verstehe. Ich kann den Shebang natürlich noch verschieben, aber das erklärt nicht wirklich, warum es funktioniert, wenn Sie nicht das ganze Skript sudo.
kemra102
In meinem Fall war alles in Ordnung, aber aus Gewohnheit habe ich mein Shell-Skript mit "sh" und nicht mit "bash" ausgeführt.
Indrajeet Gour

Antworten:

82

Das Skript beginnt nicht mit einer Shebang- Zeile, daher führt das System es mit aus /bin/sh. Unter Ubuntu /bin/shist dash eine Shell, die für den schnellen Start und die schnelle Ausführung mit nur Standardfunktionen entwickelt wurde. Wenn der Bindestrich die Zeile 68 erreicht, wird ein Syntaxfehler angezeigt: Diese Klammer bedeutet im Kontext nichts.

Da dash (wie alle anderen Shells) ein Interpreter ist, wird er sich erst beschweren, wenn die Ausführung die problematische Linie erreicht. Selbst wenn das Skript zu einem bestimmten Zeitpunkt in Ihrem Test erfolgreich gestartet worden wäre, wäre es abgebrochen worden, sobald Zeile 68 erreicht worden wäre.

Die Shebang-Linie muss das allererste sein, was in der Akte steht. Da Sie bash-Funktionen verwenden, muss die erste Zeile der Datei #!/bin/bashoder sein #!/usr/bin/env bash.

Gilles 'SO - hör auf böse zu sein'
quelle
2
Dank meiner Wissenslücke schreibe ich nicht viel und war mir dessen nicht bewusst! Vielen Dank für die Erklärung, es hat sehr geholfen und wird auch in Zukunft sehr nützlich sein, es zu wissen.
kemra102
Lassen Sie mich hinzufügen, dass dieser Fehler auch bei der Verwendung der Skripterweiterung für Nautilus auftritt. Das Hinzufügen der Shebang-Linie löste es sofort. +1.
Bhavin Doshi
Angesichts des Problems unter sonarqube.shUbuntu 15.10. Der Header wurde wie gesagt geändert. Ausführen sudo sh ./sonar.sh console. Immer noch den Fehler.
Soufrk
@soufrk Ist es sonarqube.shoder sonar.sh? Entscheide dich. Und falls Sie das Problem mit den Informationen in diesem Thread nicht lösen können, stellen Sie eine neue Frage mit dem vollständigen Inhalt des Skripts und kopieren Sie die vollständige (n) Fehlermeldung (en).
Gilles 'SO- hör auf, böse zu sein'
Mein Fehler !! Wurde eine falsche ausführbare Datei ausgeführt? Aber interessanterweise wird auf dem richtigen Bogen die Datei beginnend mit #! /bin/sheinwandfrei ausgeführt. Nun, das macht mich verwirrt.
Soufrk
6

Befindet sich der Shebang nicht in der ersten Zeile, wird er nicht beachtet, unabhängig von der Shell des Root-Benutzers, der SHELLVariablen oder der -sFlagge. Sie können dies leicht anhand eines einfachen Beispiels bestätigen:

#
#!/bin/bash
offfset=(`ls`)
echo $offset

Das Ausführen dieses Skripts mit sudo löst in den letzten Versionen von Ubuntu und Debian einen Syntaxfehler aus.

Sie haben zwei Möglichkeiten, um sicherzustellen, dass das Skript interpretiert wird bash:

  1. Bewegen Sie den Shebang in die erste Zeile

  2. Laufen Sie sudowie folgt:

    sudo bash ./pi_dev_env_install.sh
janos
quelle
1

Für mich Startskript mit:

bash ./< script file > 

funktioniert gut.

my.coolmac
quelle
Das mag für Sie zutreffen, ist aber keine wirkliche Lösung für das angegebene Problem.
Bu5hman
0

Möglicherweise haben Sie ein "(" im Verzeichnis oder im Dateinamen.

Mauro
quelle
0

Probieren Sie dos2unix in der Skriptdatei aus. Manchmal sind einige versteckte Zeichen in der Quelle vorhanden.

Befehl:

dos2unix script_file.sh script_file.sh
M Sarfraz
quelle
0

Dies kann passieren, wenn Sie den vorgesehenen Interpreter überschreiben. ZB läuft dies mit sh, unabhängig davon, welcher Hash-Knall verwendet wird (praktisch, wenn kein Hash-Knall verwendet wird):

> sh run.sh

ODER um bash auszuführen:

> bash run.sh

Verwenden Sie diesen Befehl, um den vom Skript definierten Hash-Wert zu verwenden:

> ./run.sh
Kc Gibson
quelle
-1
sudo chmod 755 <script>

In meinem Fall fehlten die Berechtigungen zum Ausführen der Datei. Erhielt nur die Fehlermeldung, als ich die Befehle trennte:

$ sudo sh
# ./install
user145114
quelle
Fehlende Berechtigungen würden diese Fehlermeldung nicht verursachen.
Gilles 'SO - hör auf böse zu sein'