лінія shebang не працює з cr-lf


10

Чому частини shebang таких елементарних сценаріїв не працюють:

$ cat hello.sh
#! /bin/sh
echo Hello
$ ./hello.sh
bash: ./hello.sh: /bin/sh^M: bad interpreter: No such file or directory

$ cat hello.py
#! /usr/bin/env python3
print("Hello")
$ ./hello.py
: No such file or directory

тоді як виклик перекладача вручну працює:

$ sh hello.sh
Hello
$ python3 hello.py
Hello

Відповіді:


11

У ваших сценаріях, ймовірно, є закінчення рядка 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), це є можливою причиною.

ПРИМІТКА. Дякую іншим, хто також коментував. Буду також радий почути, якщо є кращі відповіді!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.