Ich habe ein Bash-Skript erstellt, aber wenn ich versuche, es auszuführen, erhalte ich
#!/bin/bash no such file or directory
Ich muss den Befehl ausführen: bash script.sh
damit es funktioniert.
Wie kann ich das beheben?
bash
shell-script
executable
shebang
Nicolas de Fontenay
quelle
quelle
#!/usr/bin/env bash
statt#!/bin/bash
und auch auf der Suche hier ...Antworten:
Diese Art von Nachricht ist normalerweise auf eine falsche Shebang-Zeile zurückzuführen, entweder einen zusätzlichen Wagenrücklauf am Ende der ersten Zeile oder eine Stückliste am Anfang.
Lauf:
und sehen, wie es endet.
Das ist falsch:
Das ist auch falsch:
Das ist richtig:
Verwenden Sie
dos2unix
(odersed
,tr
,awk
,perl
,python
...) Ihr Skript zu beheben , wenn dies das Problem ist.Hier ist eine, mit der sowohl eine Stückliste als auch Tailing-CRs entfernt werden:
Beachten Sie, dass die Shell, mit der Sie das Skript ausführen, die angezeigten Fehlermeldungen geringfügig beeinflusst.
Hier sind drei Skripte, die nur ihren Namen (
echo $0
) zeigen und die folgenden Shebang-Linien haben:correctScript:
scriptWithBom:
scriptWithCRLF:
Wenn Sie sie unter bash ausführen, werden die folgenden Meldungen angezeigt:
Das Ausführen der falschen Skripte durch expliziten Aufruf des Interpreters ermöglicht die problemlose Ausführung des CRLF-Skripts:
Hier ist das Verhalten beobachtet unter
ksh
:und unter
dash
:quelle
hexdump -C yourscript | head -n 1
. Ich würde immer noch verwendendos2unix yourscript
, um es zu beheben.#!/bin/bash no such file or directory
Fehlermeldung angezeigt, da es keinen Grund gibt, etwas auszuführen oder zu öffnen#!/bin/bash
. Es ist das,/bin/bash<CR>
was ausgeführt werden würde.dos2unix
entfernt auch eine UTF-8-Stückliste. Eine UTF-8-Stückliste hätte die Fehlermeldung erklären können.Dies kann auch durch eine Stückliste in einem UTF-8-Skript verursacht werden. Wenn Sie das Skript in Windows erstellen, werden Sie manchmal am Anfang der Datei mit Junk-E-Mails konfrontiert.
quelle
Tatsächlich ist das richtige Wort für das Bash-Skript das Folgende:
Denn in freeBSD befindet sich bash in
/usr/local/bin/bash
quelle
Sie können vi verwenden, um beide Probleme zu beheben, falls vorhanden:
quelle
Wenn Sie nicht über dos2unix verfügen, können Sie dieses Problem auf diese Weise beheben.
quelle
Byte-Order Mark (BOM)
Dies kann durch eine Stückliste verursacht werden. Bei Wikipedia ist eine Stückliste eine
Leider wird dem Linux-Kernel, der die She-Bang-Leitung verwaltet, nichts signalisiert. Sie können überprüfen Sie eine Stückliste haben durch Verwendung
file
,Sie können die ersten Zeichen auch hexadezimal ausgeben und überprüfen, ob sie manuell mit einem der Stücklistenzeichen übereinstimmen
Sie können die Stücklistenzeichen entfernen, sobald Sie sie so kennen.
quelle
Ich hatte das Problem, indem ich versehentlich eine falsche ausführbare Bash-Datei zu dem
PATH
Skript hinzugefügt habe, und weil in meinem Skript der flexiblere#!/usr/bin/env bash
Shebang verwendet wurde (nimm die erste ausführbare Bash-Datei aus dem Pfad).Ich habe GIT für Windows installiert, um
cygwin
mit Windows GIT-GUIs zusammenzuarbeiten (funktionierte nicht mit nativem Cygwin-Git ...). Ich habe das jetzt gelöst, indem ich zu#!/bin/bash
sheband gewechselt und GIT für Windows von entfernt habePATH
.quelle
Versuchen
#!/bin/bash
Zweite Sache:
find / -name bash
Dritte Sache:
ls -al /bin/bash
quelle
which bash
. Wir wissen, dass es eins findet, weil es damit arbeitetbash script.sh
.