Повідомлення такого типу зазвичай пов'язані з хибною лінією shebang, або з додатковим поверненням перевезення в кінці першого рядка, або з BOM на початку.
Виконати:
$ head -1 yourscript | od -c
і подивіться, як це закінчується.
Це неправильно:
0000000 # ! / b i n / b a s h \r \n
Це теж неправильно:
0000000 357 273 277 # ! / b i n / b a s h \n
Це правильно:
0000000 # ! / b i n / b a s h \n
Використання dos2unix
(або sed
, tr
, awk
, perl
, python
...) , щоб виправити сценарій , якщо це питання.
Ось такий, який видалить і КР, і КР:
sed -i '1s/^.*#//;s/\r$//' brokenScript
Зауважте, що оболонка, яку ви використовуєте для запуску сценарію, незначно вплине на відображення повідомлень про помилки.
Ось три сценарії, що лише показують їх ім’я ( echo $0
) та мають такі відповідні рядки:
правильний сценарій:
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
Під bash, запуск їх покаже наступні повідомлення:
$ ./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
Запуск фальшивих файлів шляхом чіткого виклику інтерпретатора дозволяє запускати сценарій CRLF без жодних проблем:
$ bash ./scriptWithCRLF
./scriptWithCRLF
$ bash ./scriptWithBom
./scriptWithBom: line 1: #!/bin/bash: No such file or directory
./scriptWithBom
Ось поведінка, яка спостерігається під ksh
:
$ ./scriptWithCRLF
ksh: ./scriptWithCRLF: not found [No such file or directory]
$ ./scriptWithBom
./scriptWithBom[1]: #!/bin/bash: not found [No such file or directory]
./scriptWithBom
і під dash
:
$ ./scriptWithCRLF
dash: 2: ./scriptWithCRLF: not found
$ ./scriptWithBom
./scriptWithBom: 1: ./scriptWithBom: #!/bin/bash: not found
./scriptWithBom