Является ли #! / Bin / sh интерпретатором?

Одна вещь, которую нужно попробовать:

ldconfig -vv | grep libalure

... libalure.so.1 -> libalure.so

Это скажет вам, если ваша библиотека динамически связана , убедитесь, что у вас есть ссылка на /usr/local/lib в ваших /etc/ld.so.conf и /etc/ld.so.conf.d также

(теперь это автоматически ссылается на /etc/ld.so.conf.d/libc)

1
задан 9 January 2013 в 13:46

3 ответа

Шебанг - это последовательность символов, состоящая из знака номера знака и восклицательного знака (например, «#!»), когда он встречается как начальные два символа в начальной строке скрипта.

Под * nix, когда запускается скрипт, начинающийся с shebang, загрузчик программ анализирует остальную часть начальной строки скрипта как директиву интерпретатора; вместо этого выполняется указанная программа интерпретатора, передавая ей в качестве аргумента путь, который изначально использовался при попытке запустить скрипт. Например, если сценарий имеет имя с именем path / to / your-script, и он начинается со следующей строки:

#!/bin/sh

, тогда загрузчику программы будет предложено запустить программу " / bin / sh "вместо этого оболочкой Bourne или совместимой оболочкой, передавая «путь / в / ваш-скрипт» в качестве первого аргумента.

Соответственно, это сценарий с именем path / to / python-script и начинается со следующей строки:

#!/bin/python

, после чего загружается программа для запуска программы «/ bin / python» вместо Интерпретатор Python, передающий «path / to / python-script» в качестве первого аргумента.

Короче говоря, «#» будет комментировать строку, пока последовательность символов «#!» встречающиеся как первые два символа в исходной строке скрипта, имеют значение, описанное выше.

Подробнее см. Почему некоторые скрипты начинаются с #! ...?

Источник: некоторые разделы этого ответа получены (с небольшими изменениями) из Shebang (Unix) в английской Википедии (от авторов Wikipedia). Эта статья лицензируется в CC-BY-SA 3.0, как и пользовательский контент здесь, на AU, поэтому этот вывод разрешен с атрибуцией.

7
ответ дан 25 May 2018 в 02:37

#! называется shebang, когда он встречается как начальные два символа в начальной строке скрипта. Он используется в сценариях для указания интерпретатора для выполнения. [F3] для операционной системы (ядра), а не для оболочки; поэтому он не будет интерпретироваться как комментарий.

Предоставлено: http://en.wikipedia.org/wiki/Shebang_%28Unix%29

В общем случае, если файл является исполняемым, но фактически не исполняемой (двоичной) программой, и такая строка присутствует, программа, указанная после #! запускается с именем сценария и всеми его аргументами. Эти два символа # и! должны быть первые два байта в файле!

Предоставлено: http://en.wikipedia.org/wiki/Shebang_%28Unix%29

4
ответ дан 25 May 2018 в 02:37

Нет, он используется только системным вызовом exec ядра Linux и рассматривается как комментарий интерпретатора

. Когда вы делаете на bash:

./something

в Linux, это вызывает системный вызов exec с полным путем к something.

Эта строка ядра вызывается в файле, переданном в exec: https: // github .com / torvalds / linux / blob / v4.8 / fs / binfmt_script.c # L25

if ((bprm-> buf [0]! = '#') || (bprm-> buf [1]! = '!'))

Это считывает самые первые байты файла и сравнивает их с #!.

Если это так, то остальные строки анализируется ядром Linux, что делает другим вызовом exec с path /usr/bin/env python и текущим файлом в качестве первого аргумента:

/usr/bin/env python /path/to/script.py

, и это работает для любого языка сценариев, который использует # в качестве символа комментария.

И да, вы можете сделать бесконечный цикл с помощью:

#!/a

и исполняемого файла в /a

просто оказывается читаемым человеком, но это не требуется.

Если файл начинался с байтов, тогда системный вызов exec будет использовать другой обработчик. Другим наиболее важным встроенным обработчиком является исполняемый файл ELF: https://github.com/torvalds/linux/blob/v4.8/fs/binfmt_script.c#L25 , который проверяет байты 7f 45 4c 46 (что также, по-видимому, является человеком, читаемым для .ELF). Это считывает файл ELF, правильно помещает его в память и запускает с ним новый процесс. См. Также: https://stackoverflow.com/questions/8352535/how-does-kernel-get-an-executable-binary-file-running-under-linux/31394861#31394861

Наконец, вы могут добавлять ваши собственные обработчики shebang с помощью механизма binfmt_misc. Например, вы можете добавить пользовательский обработчик для файлов .jar: https://stackoverflow.com/questions/8352535/how-does-kernel-get-an-executable-binary-file-running-under- linux / 31394861 # 31394861 Этот механизм даже поддерживает обработчики с расширением файла.

Я не думаю, что POSIX указывает на shebangs: https://unix.stackexchange.com/a/346214/32558 , хотя он упоминает в разделах обоснования и в форме «если исполняемые скрипты поддерживаются системой, что-то может случиться».

0
ответ дан 25 May 2018 в 02:37

Другие вопросы по тегам:

Похожие вопросы: