it-swarm.com.de

#! / bin / bash - keine solche Datei oder kein solches Verzeichnis

Ich habe ein Bash-Skript erstellt, aber wenn ich versuche, es auszuführen, bekomme 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?

76

Diese Art von Nachricht ist normalerweise auf eine gefälschte Shebang-Zeile zurückzuführen, entweder einen zusätzlichen Wagenrücklauf am Ende der ersten Zeile oder eine Stückliste am Anfang.

Lauf:

$ head -1 yourscript | od -c

und sehen, wie es endet.

Das ist falsch:

0000000   #   !   /   b   i   n   /   b   a   s   h  \r  \n

Das ist auch falsch:

0000000 357 273 277   #   !   /   b   i   n   /   b   a   s   h  \n

Das ist richtig:

0000000   #   !   /   b   i   n   /   b   a   s   h  \n

Verwenden dos2unix (oder sed, tr, awk, Perl, python…), um Ihr Skript zu reparieren, wenn dies das Problem ist.

Hier ist eine, mit der sowohl Stücklisten- als auch End-CRs entfernt werden:

sed -i '1s/^.*#//;s/\r$//' brokenScript

Hier sind drei Skripte, die nur ihren Namen zeigen (echo $0) und mit den folgenden Shebang-Linien:

korrektes Skript:

0000000   #   !   /   b   i   n   /   b   a   s   h  \n

scriptWithBom:

0000000 357 273 277   #   !   /   b   i   n   /   b   a   s   h  \n

scriptWithCRLF:

0000000   #   !   /   b   i   n   /   b   a   s   h  \r  \n

Wenn Sie sie unter Bash ausführen, werden folgende Meldungen angezeigt:

$ ./correctScript
./correctScript
$ ./scriptWithCRLF
bash: ./scriptWithCRLF: /bin/bash^M: bad interpreter: No such file or directory
$ ./scriptWithBom
./scriptWithBom: line 1: #!/bin/bash: No such file or directory
./scriptWithBom

Wenn Sie die falschen ausführen, indem Sie den Interpreter explizit aufrufen, kann das CRLF-Skript problemlos ausgeführt werden:

$ bash ./scriptWithCRLF
./scriptWithCRLF
$ bash ./scriptWithBom
./scriptWithBom: line 1: #!/bin/bash: No such file or directory
./scriptWithBom

Hier ist das unter ksh beobachtete Verhalten:

$ ./scriptWithCRLF
ksh: ./scriptWithCRLF: not found [No such file or directory]
$ ./scriptWithBom
./scriptWithBom[1]: #!/bin/bash: not found [No such file or directory]
./scriptWithBom

und unter dash:

$ ./scriptWithCRLF
dash: 2: ./scriptWithCRLF: not found
$ ./scriptWithBom
./scriptWithBom: 1: ./scriptWithBom: #!/bin/bash: not found
./scriptWithBom
108
jlliagre

Dies kann auch durch eine Stückliste in einem UTF-8-Skript verursacht werden. Wenn Sie das Skript in Windows erstellen, wird am Anfang der Datei manchmal Junk angezeigt.

17
teknopaul

Sie können vi verwenden, um beide Probleme zu beheben, falls sie vorhanden sind:

vi <your_file>
:set ff=unix
:set nobomb
:wq
10
cwash

Eigentlich ist das richtige Shebang für Bash-Skript das Folgende:

#!/usr/bin/env bash

Weil sich in freeBSD bash in /usr/local/bin/bash Befindet.

10
moebius_eye

Wenn Sie nicht über dos2unix verfügen, können Sie dieses Problem auf diese Weise beheben.

cp script _p4 && tr -d '\r' < _p4 > script && rm _p4
4
cokedude

Byte-Order Mark (BOM)

Dies kann durch eine Stückliste verursacht werden. Aus Wikipedia ist eine Stückliste eine

Das Byte Order Mark (BOM) ist ein Unicode-Zeichen, U + FEFF Byte Order Mark (BOM), dessen Erscheinen als magische Zahl am Anfang eines Textstroms einem Programm, das den Text verbraucht, mehrere Dinge signalisieren kann

Leider es signalisiert dem Linux-Kernel, der die She-Bang-Zeile verarbeitet, nichts. Sie können überprüfen, ob Sie eine Stückliste haben, indem Sie file verwenden.

file /tmp/foo 
/tmp/foo: UTF-8 Unicode (with BOM) text

Oder Sie können die ersten Zeichen hexdumpen und sehen wenn sie manuell mit einem der Stücklistenzeichen übereinstimmen

Sie können die Stücklistenzeichen entfernen, sobald Sie sie so kennen.

sed -i '1 s/^\xef\xbb\xbf//' *.txt
3
Fabien Haddadi

Ich hatte das Problem, indem ich versehentlich eine falsche ausführbare Bash-Datei zum PATH hinzufügte und weil in meinem Skript das flexiblere #!/usr/bin/env bash Shebang wurde verwendet (nehmen Sie die erste ausführbare Bash-Datei vom Pfad).

command -v bash
/cygdrive/c/Program Files/Git/bin//bash

Ich habe GIT für Windows so installiert, dass es in cygwin zusammen mit Windows GIT-GUIs funktioniert (funktionierte nicht mit cygwin native git ...). Ich habe das jetzt gelöst, indem ich zu #!/bin/bash sheband und Entfernen von GIT für Windows aus PATH.

0
jan