Jedes Mal, wenn ich ein Skript über bash scriptname.sh
die Befehlszeile in Debian ausführe , erhalte ich Command Not found
das Ergebnis des Skripts.
Das Skript funktioniert, aber Command Not Found
für jede leere Zeile wird immer eine Anweisung auf dem Bildschirm gedruckt. Jede leere Zeile führt dazu, dass ein Befehl nicht gefunden wird.
Ich führe das Skript aus dem /var
Ordner aus.
Hier ist das Skript:
#!/bin/bash
echo Hello World
Ich führe es aus, indem ich Folgendes eingebe:
bash testscript.sh
Warum sollte das passieren?
bash -x scriptname.sh
diese Option , um den Fehler zu verfolgen. - In meinem Fall war es eine unter Windows gespeicherte sh-Datei mit VSCode und Zeilenenden als "CRLF". In VSCode in der unteren rechten Ecke können Sie den Zeilenabschluss von "CRLF" in "LF" ändern. Diese Datei wurde hochgeladen und konnte schließlich mit ausgeführt werdenbash scriptname.sh
.Antworten:
Stellen Sie sicher, dass Ihre erste Zeile lautet:
Geben Sie Ihren Pfad zum Bash ein, wenn dies nicht der Fall ist
/bin/bash
Versuchen Sie zu laufen:
Dadurch werden Zeilenenden usw. von Windows in das Unix-Format konvertiert. dh es entfernt \ r (CR) von den Zeilenenden, um sie von
\r\n (CR+LF)
zu zu ändern\n (LF)
.Weitere Details zum
dos2unix
Befehl (Manpage)Eine andere Möglichkeit, um festzustellen, ob Ihre Datei im Dos / Win-Format vorliegt:
Die Ausgabe sieht ungefähr so aus:
Dadurch wird der gesamte Dateitext ausgegeben, der
<CR>
für jedes\r
Zeichen in der Datei angezeigt wird .quelle
bash scriptname.sh
(aber es ist natürlich immer noch eine gute Übung).Sie können es verwenden
bash -x scriptname.sh
, um es zu verfolgen.quelle
Ich bin auch auf ein ähnliches Problem gestoßen. Das Problem scheinen Berechtigungen zu sein. Wenn du eine machst
ls -l
, können Sie möglicherweise feststellen, dass in Ihrer Datei das Ausführungsbit möglicherweise NICHT aktiviert ist. Dadurch kann das Skript NICHT ausgeführt werden. :) :)Als @artooro im Kommentar hinzugefügt:
quelle
chmod +x testscript.sh
Dies mag trivial sein und hat nichts mit der Frage des OP zu tun, aber ich habe dies zu Beginn des Lernens von Skripten oft falsch gemacht
Dies führt zu einer Antwort "Befehl nicht gefunden". Der richtige Weg ist, die Leerzeichen zu entfernen
quelle
Wenn das Skript seine Arbeit (relativ) gut macht, läuft es in Ordnung. Ihr Problem ist wahrscheinlich eine einzelne Zeile in der Datei, die auf ein Programm verweist, das sich entweder nicht im Pfad befindet, nicht installiert, falsch geschrieben oder ähnlich ist.
Eine Möglichkeit besteht darin, ein
set -x
oben in Ihrem Skript zu platzieren oder es mitbash -x
statt nur auszuführenbash
auszuführen. werden die Zeilen vor der Ausführung ausgegeben, und Sie müssen normalerweise nur die Befehlsausgabe unmittelbar vor dem Fehler überprüfen, um festzustellen, was das Problem verursachtWenn es, wie Sie sagen, die leeren Zeilen sind, die die Probleme verursachen, möchten Sie möglicherweise überprüfen, was tatsächlich in ihnen enthalten ist. Lauf:
und stellen Sie sicher, dass es keine "unsichtbaren" lustigen Zeichen wie den
CTRL-M
(Wagenrücklauf) gibt, die Sie möglicherweise mit einem Windows-Editor erhalten.quelle
Unter Bash für Windows habe ich falsch versucht, es auszuführen
ohne ./ am anfang und habe den gleichen fehler bekommen.
Für Personen mit Windows-Hintergrund sieht das richtige Formular überflüssig aus:
quelle
Verwenden Sie
dos2unix
für Ihre Skriptdatei.quelle
Versuchen
chmod u+x testscript.sh
Ich weiß es von hier: http://www.linuxquestions.org/questions/red-hat-31/running-shell-script-command-not-found-202062/
quelle
Um dies auszuführen, müssen Sie beispielsweise den vollständigen Pfad dafür angeben
quelle
Wenn Sie Notepad ++ haben und diese .sh-Fehlermeldung erhalten: "Befehl nicht gefunden" oder diese Autoconf-Fehlermeldung "Zeile 615: ../../autoconf/bin/autom4te: Keine solche Datei oder kein solches Verzeichnis" .
Gehen Sie auf Ihrem Notepad ++ zu Bearbeiten -> EOL-Konvertierung und überprüfen Sie Macinthos (CR) . Dadurch werden Ihre Dateien bearbeitet. Ich empfehle auch, alle Dateien mit diesem Befehl zu überprüfen, da bald ein solcher Fehler auftreten wird.
quelle
Hatte das gleiche Problem. Unglücklicherweise
Also habe ich das getan, um zu konvertieren.
und dann
quelle
Probleme beim Ausführen von Skripten können auch mit einer fehlerhaften Formatierung mehrzeiliger Befehle zusammenhängen, z. B. wenn Sie nach dem Zeilenumbruch "\" ein Leerzeichen haben. ZB das:
(Bitte beachten Sie den zusätzlichen Speicherplatz nach "\") verursacht Probleme, aber wenn Sie diesen Speicherplatz entfernen, läuft er einwandfrei.
quelle
Ich hatte auch einige von
Cannot execute command
. Alles sah korrekt aus, aber tatsächlich hatte ich
direkt vor meinem Befehl einen nicht zerbrechlichen Raum, der natürlich mit bloßem Auge nicht zu erkennen war:Was in Vim so aussah:
Erst nachdem
shellcheck
ich die Bash-Skriptprüfung ausgeführt hatte, fand ich das Problem.quelle
shellcheck
ist online verfügbar, obwohl Sie Ihr Skript natürlich genau kopieren und einfügen müssen, damit dies hilft. shellcheck.netIch bin heute darauf gestoßen und habe geistesabwesend die Dollar-Eingabeaufforderung
$
(vor einer Befehlszeichenfolge) in das Skript kopiert .quelle
Fügen Sie das aktuelle Verzeichnis (.) Zu PATH hinzu, um ein Skript ausführen zu können, indem Sie einfach seinen Namen eingeben, der sich im aktuellen Verzeichnis befindet:
quelle
.
ZU IHREM WEG HINZUFÜGEN.Möglicherweise möchten Sie Ihre .bashrc- und .bash_profile-Dateien mit Aliasnamen aktualisieren, um den von Ihnen eingegebenen Befehl zu erkennen.
.bashrc- und .bash_profile-Dateien sind versteckte Dateien, die sich wahrscheinlich auf Ihrem Laufwerk C: befinden, auf dem Sie Ihre Programmdateien speichern.
quelle