Ваши сценарии, вероятно, имеют окончания строки CR-LF в стиле DOS, а не окончания строки LF в стиле Unix. ^ M, замеченный в сообщении об ошибке в первом случае, указывает на то, что символ 0D был интерпретирован как часть имени интерпретатора сценария, а не как часть окончания строки (как можно было бы ожидать). Поскольку в вашей системе нет исполняемого файла с путем, который содержит символ 0D (^ M), система не может вызвать интерпретатор. Когда вы вручную вызываете свой интерпретатор, он может обрабатывать оба вида концов строк, присутствующих в сценарии.
Если вы конвертируете сценарии в конец строки LF в стиле Unix, вы должны увидеть, как работает шебанг. Продолжайте читать для иллюстрации.
В приведенном ниже сеансе todos и fromdos - это утилита (доступная в Ubuntu в качестве пакета tofrodos
) для преобразования соглашений о конце строки из CR-LF в LF. Любая эквивалентная утилита (см. Этот вопрос unix.SE ) подойдет для демонстрации.
Следующая стенограмма сеанса (выполняется с теми же файлами сценариев) должна прояснить ситуацию:
$ fromdos hello.sh
$ ./hello.sh
Hello
$ todos hello.sh
$ ./hello.sh
bash: ./hello.sh: /bin/sh^M: bad interpreter: No such file or directory
$
$ fromdos hello.py
$ ./hello.py
Hello
$ todos hello.py
$ ./hello.py
: No such file or directory
$
Это кажется , что это ядро , которое считывает притон линию, и , по- видимому, ядро Linux (по крайней мере, в версии на моей системе Kubuntu Дерзкой) не распознает CR как часть линии CR-LF , заканчивающуюся конвенцию.
Если кажется, что шебанг вашего скрипта не работает (то есть ручной вызов интерпретатора скрипта работает, но вы не можете выполнить скрипт, используя имя файла, даже если вы это сделали chmod +x
), то это возможная причина.
ПРИМЕЧАНИЕ:
спасибо всем, кто прокомментировал тоже. Я также был бы рад услышать, если есть лучшие ответы!