Ten rodzaj wiadomości zwykle wynika z fałszywej linii shebang, albo dodatkowego powrotu karetki na końcu pierwszej linii, albo BOM na jej początku.
Biegać:
$ head -1 yourscript | od -c
i zobacz jak to się skończy.
To jest źle:
0000000 # ! / b i n / b a s h \r \n
To też jest złe:
0000000 357 273 277 # ! / b i n / b a s h \n
To jest poprawne:
0000000 # ! / b i n / b a s h \n
Użyj dos2unix
(lub sed
, tr
, awk
, perl
, python
...), aby naprawić swój skrypt, czy jest to problem.
Oto jeden, który usunie zarówno BOM, jak i tailing CR:
sed -i '1s/^.*#//;s/\r$//' brokenScript
Pamiętaj, że powłoka używana do uruchomienia skryptu nieznacznie wpłynie na wyświetlane komunikaty o błędach.
Oto trzy skrypty pokazujące tylko swoją nazwę ( echo $0
) i posiadające następujące odpowiednie linie shebang:
poprawny skrypt:
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
Uruchomienie ich w ramach bash spowoduje wyświetlenie następujących komunikatów:
$ ./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
Uruchamianie fałszywych przez jawne wywołanie interpretera pozwala na uruchomienie skryptu CRLF bez żadnych problemów:
$ bash ./scriptWithCRLF
./scriptWithCRLF
$ bash ./scriptWithBom
./scriptWithBom: line 1: #!/bin/bash: No such file or directory
./scriptWithBom
Oto zachowanie zaobserwowane w ksh
:
$ ./scriptWithCRLF
ksh: ./scriptWithCRLF: not found [No such file or directory]
$ ./scriptWithBom
./scriptWithBom[1]: #!/bin/bash: not found [No such file or directory]
./scriptWithBom
i poniżej dash
:
$ ./scriptWithCRLF
dash: 2: ./scriptWithCRLF: not found
$ ./scriptWithBom
./scriptWithBom: 1: ./scriptWithBom: #!/bin/bash: not found
./scriptWithBom