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?
quelle
dash
statt von interpretiert wirdbash
. Versuchen Sie, den Shebang in Zeile 1 zu verschieben.Antworten:
Das Skript beginnt nicht mit einer Shebang- Zeile, daher führt das System es mit aus
/bin/sh
. Unter Ubuntu/bin/sh
ist 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/bash
oder sein#!/usr/bin/env bash
.quelle
sonarqube.sh
Ubuntu 15.10. Der Header wurde wie gesagt geändert. Ausführensudo sh ./sonar.sh console
. Immer noch den Fehler.sonarqube.sh
odersonar.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).#! /bin/sh
einwandfrei ausgeführt. Nun, das macht mich verwirrt.Befindet sich der Shebang nicht in der ersten Zeile, wird er nicht beachtet, unabhängig von der Shell des Root-Benutzers, der
SHELL
Variablen oder der-s
Flagge. Sie können dies leicht anhand eines einfachen Beispiels bestätigen: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
:Bewegen Sie den Shebang in die erste Zeile
Laufen Sie
sudo
wie folgt:quelle
Für mich Startskript mit:
funktioniert gut.
quelle
Möglicherweise haben Sie ein "(" im Verzeichnis oder im Dateinamen.
quelle
Probieren Sie dos2unix in der Skriptdatei aus. Manchmal sind einige versteckte Zeichen in der Quelle vorhanden.
Befehl:
quelle
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):
ODER um bash auszuführen:
Verwenden Sie diesen Befehl, um den vom Skript definierten Hash-Wert zu verwenden:
quelle
In meinem Fall fehlten die Berechtigungen zum Ausführen der Datei. Erhielt nur die Fehlermeldung, als ich die Befehle trennte:
quelle