Сообщение такого рода обычно происходит из-за фиктивной строки shebang, либо из-за дополнительного возврата каретки в конце первой строки, либо из спецификации в начале.
Бегать:
$ 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
...) , чтобы исправить сценарий , если это вопрос.
Вот тот, который удалит как спецификацию, так и хвостовые CR:
sed -i '1s/^.*#//;s/\r$//' brokenScript
Обратите внимание, что оболочка, которую вы используете для запуска скрипта, немного повлияет на отображаемые сообщения об ошибках.
Вот три сценария, которые просто показывают их имя ( echo $0
) и имеют следующие соответствующие строки:
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
Под 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