it-swarm.com.de

Bash-Skript druckt immer "Befehl nicht gefunden"

Jedes Mal, wenn ich in Debian ein Skript mit bash scriptname.sh von der Befehlszeile aus ausführe, erhalte ich Command Not found und dann das Ergebnis des Skripts. Das Skript funktioniert also, aber es wird immer eine Command Not Found-Anweisung auf dem Bildschirm gedruckt.

Ich verwende das Skript aus dem /var-Ordner.

Hier ist das Skript:

#!/bin/bash

echo Hello World

Ich führe es aus, indem ich folgendes eingebe:

bash testscript.sh

UPDATE - das Problem erscheint in den leeren Zeilen. Jede leere Zeile führt dazu, dass ein Befehl nicht gefunden wird. Warum sollte das passieren?

87
David

Stellen Sie sicher, dass Ihre erste Zeile lautet:

#!/bin/bash

Geben Sie Ihren Pfad zur Bash ein, wenn es nicht /bin/bash ist.


Laufen Sie mal:

dos2unix script.sh

Dadurch werden Zeilenenden usw. von Windows in das Unix-Format konvertiert. es entfernt\r (CR) von Zeilenenden, um sie von \r\n (CR+LF) in \n (LF) zu ändern.

Weitere Details zum dos2unix-Befehl (Manpage)


Eine andere Möglichkeit, um festzustellen, ob Ihre Datei im DOS/Win-Format vorliegt:

cat scriptname.sh | sed 's/\r/<CR>/'

Die Ausgabe sieht ungefähr so ​​aus:

#!/bin/sh<CR>
<CR>
echo Hello World<CR>
<CR>

Dadurch wird der gesamte Datei-Text mit <CR> für jedes \r-Zeichen in der Datei ausgegeben.

141
chown

Sie können bash -x scriptname.sh verwenden, um es zu verfolgen.

46
clyfish

Ich bin auch auf eine ähnliche Ausgabe gestoßen. Die Ausgabe scheint Berechtigungen zu sein. Wenn Sie einen ls -l ausführen, können Sie möglicherweise feststellen, dass in Ihrer Datei das Ausführungsbit NICHT aktiviert ist. Dadurch kann das Skript NICHT ausgeführt werden. :)

Als @artooro im Kommentar hinzugefügt:

Um dieses Problem zu beheben, führen Sie chmod +x testscript.sh aus.

35
Lypso345

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 ist, falsch geschrieben wurde oder etwas Ähnliches.

Eine Möglichkeit besteht darin, einen set -x am Anfang Ihres Skripts zu platzieren oder ihn mit bash -x anstelle von bash auszuführen. Dadurch werden die Zeilen ausgegeben, bevor sie ausgeführt werden. In der Regel müssen Sie nur nachsehen an der Befehlsausgabe unmittelbar vor dem Fehler, um zu sehen, was das Problem verursacht

Wenn, wie Sie sagen, es die leeren Zeilen sind, die die Probleme verursachen, möchten Sie vielleicht überprüfen, was genau passiert in ihnen. Lauf:

od -xcb testscript.sh

und stellen Sie sicher, dass es keine "unsichtbaren" lustigen Zeichen wie den CTRL-M (Wagenrücklauf) gibt, den Sie möglicherweise mit einem Windows-Editor erhalten.

11
paxdiablo

verwenden Sie dos2unix in Ihrer Skriptdatei. 

6
bash-o-logist

Wenn Sie über Notepad ++ verfügen und diese .sh-Fehlermeldung erhalten: "Befehl nicht gefunden" Oder diese autoconf-Fehlermeldung "Zeile 615: ../../autoconf/bin/autom4te: Keine solche Datei oder Ordner" .

Gehen Sie in Ihrem Notepad ++ zu Bearbeiten -> EOL-Konvertierung und dann Macinthos (CR) . Dadurch werden Ihre Dateien bearbeitet. Ich empfehle außerdem, alle Dateien mit diesem Befehl zu überprüfen, Da bald ein solcher Fehler auftreten wird.

6
Juniar

um dies auszuführen, müssen Sie beispielsweise den vollständigen Pfad dieses angeben

/home/Manuel/mywrittenscript
5
Masood Moghini
5
Aminah Nuraini

Das mag trivial sein und hat nichts mit der Frage des OP zu tun, aber ich habe mich anfangs oft geirrt, als ich Scripting lernte

VAR_NAME = $(hostname)
echo "the hostname is ${VAR_NAME}"  

Daraufhin wird die Antwort 'Befehl nicht gefunden' angezeigt. Der richtige Weg ist, die Leerzeichen zu entfernen 

VAR_NAME=$(hostname)
4
altamont

Hatte das gleiche Problem. Unglücklicherweise 

dos2unix winfile.sh
bash: dos2unix: command not found

also tat ich das umzuwandeln.

 awk '{ sub("\r$", ""); print }' winfile.sh > unixfile.sh

und dann 

bash unixfile.sh
3
Eugene Cuz

Probleme beim Ausführen von Skripts können auch zu einer fehlerhaften Formatierung von mehrzeiligen Befehlen führen, z. B. wenn Sie nach dem Zeilenumbruch "\" ein Leerzeichen haben. Z.B. diese:

./run_me.sh \ 
--with-some parameter

(Bitte beachten Sie das zusätzliche Leerzeichen nach "\") führt zu Problemen, aber wenn Sie das Leerzeichen entfernen, läuft es einwandfrei.

2
Marek Wysocki

Bei Bash für Windows habe ich falsch ausgeführt

run_me.sh 

ohne ./ am anfang und bekam den gleichen fehler.

Für Leute mit Windows-Hintergrund sieht das richtige Formular überflüssig aus:

./run_me.sh
1

Heute bin ich darauf gestoßen und habe den Dollar-Befehl Prompt $ (vor einer Befehlszeichenfolge) in das Skript kopiert.

0
CNSKnight

Ich hatte auch einige der Cannot execute command. Alles sah korrekt aus, aber in der Tat hatte ich einen untrennbaren Raum &nbsp; vor meinem Befehl, der natürlich nicht mit bloßem Auge zu erkennen war:

if [[ "true" ]]; then
  &nbsp;highlight --syntax js "var i = 0;"
fi

Was in Vim aussah:

if [[ "true" ]]; then
  highlight --syntax js "var i = 0;"
fi

Erst nachdem ich den Bash-Skriptprüfer shellcheck ausgeführt hatte, fand ich das Problem.

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:

PATH=.:$PATH
0
Mike Goethals

Sie können Ihre .bashrc- und .bash_profile-Dateien mit Aliasnamen aktualisieren, um den Befehl zu erkennen, den Sie eingeben.

.bashrc- und .bash_profile-Dateien sind versteckte Dateien, die sich wahrscheinlich auf Ihrem Laufwerk C: befinden, in dem Sie Ihre Programmdateien speichern.

0
Kean Amaral