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:
$ 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 Sie dos2unix
(oder sed
, 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:
sed -i '1s/^.*#//;s/\r$//' brokenScript
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:
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 die folgenden 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
Das Ausführen der falschen Skripte durch expliziten Aufruf des Interpreters ermöglicht die problemlose Ausführung des CRLF-Skripts:
$ bash ./scriptWithCRLF
./scriptWithCRLF
$ bash ./scriptWithBom
./scriptWithBom: line 1: #!/bin/bash: No such file or directory
./scriptWithBom
Hier ist das Verhalten beobachtet unter ksh
:
$ ./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