Какова функция bash shebang? [дубликат]

X-сервер также поддерживает абстрактные сокеты, которые работают идентично сокетам UNIX и имеют пути, аналогичные сокетам UNIX, но имена путей начинаются с символа NUL. См. Документацию по «аннотации» на странице руководства unix (7) . Абстрактный сокет фактически существует во всех пространствах имен файловой системы и корневых каталогах; вам не нужно ничего связывать с chroot или пространством имен, чтобы использовать это.

Возможно, и X-сервер, и клиент используют для связи абстрактный сокет? X-клиенты, использующие стандартные клиентские библиотеки X, будут автоматически пытаться использовать абстрактный сокет, до они попытаются использовать сокет UNIX по умолчанию. В libxcb см. _xcb_open и _xcb_open_abstract в src / xcb_util.c .

16
29.03.2017, 13:08
4 ответа
  • Функция shebang такова:

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

  • В чем разница между выполнением файла с помощью ./file или sh-файла?

Сценарий Bourne shell, который идентифицируется путем some/path/to/foo, имеет начальную строку,

 #!/bin/sh -x

и выполняется с параметрами bar и baz как

 some/path/to/foo bar baz

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

 /bin/sh -x some/path/to/foo bar baz

Примечание: В 1980 году Деннис Ритчи представил поддержку ядром директив интерпретатора:

Система была изменена таким образом, что если выполняемый файл
начинается с магических символов #! , остальная часть строки понимается
как имя интерпретатора для выполняемого файла.
Ранее (и фактически до сих пор) shell выполнял большую часть этой работы;
она автоматически выполняла себя на текстовом файле с исполняемым режимом
когда имя текстового файла было набрано в качестве команды.
Включение этого средства в систему дает следующие
преимущества.

1) Это делает сценарии оболочки более похожими на настоящие исполняемые файлы,
потому что они могут быть объектом 'exec'.

2) Если вы выполните 'ps' во время выполнения такой команды, ее настоящее
вместо 'sh' появится ее настоящее имя.
Аналогично, учет ведется на основе реального имени.

3) Shell-скрипты могут иметь set-user-ID.

Примечание: Linux игнорирует бит setuid для всех интерпретируемых исполняемых файлов (т.е. исполняемых файлов, начинающихся со строки #!).

4) Проще иметь альтернативные оболочки;
например, если вам нравится Berkeley csh, то нет вопросов о том.
какая оболочка должна интерпретировать файл.

5) Это позволит другим интерпретаторам более гладко вписаться в систему.

Подробнее :

11
27.01.2020, 19:48

bash сам не придает никакого значения строке shebang, он видит ее только как комментарий. Когда оболочка читает командную строку, и команда является внешней программой (а не внутренней командой, как cd), она выполняет команду, используя системный вызов execve. Затем ядро проверяет, каким исполняемым файлом является файл, переданный в execve, проверяя магическое число в начале файла. Если магическое число состоит из двух байтов 0x23 0x21 (ASCII символы #! ), ядро предполагает, что за ними следует абсолютный путь к интерпретатору сценария. Затем ядро запускает интерпретатор, передавая ему сценарий.

5
27.01.2020, 19:48

Ну, если быть на 100% точным, то "bash shebang" не так уж и много. Шебанг может появляться в различных формах. Это просто указание интерпретатора. Так что шебанг, скажем, #!/usr/bin/perl будет, например, "perl shebang" и укажет на интерпретатор perl как на интерпретатор для такого шрипта. После этого вы можете вызывать такой perl-скрипт, как любой shell-скрипт, напрямую. То же самое относится и к любому другому интерпретатору скриптов. Это может быть php, или cshell, или prolog, или basic, или любой другой, который интерпретирует текстовые файлы каким-либо образом. И, конечно, этот интерпретатор должен уметь игнорировать shebang. Для bash это просто строка комментария. То же самое верно для php и perl. Я думаю, что prolog подавился бы этой строкой. Шебанг также должен работать без проблем с вашим собственным приложением, если только оно способно интерпретировать текст и игнорировать шебанг.

Было бы интересно, если бы, например, интерпретатор JavaScript мог игнорировать такой "Javascript shebang" :)

.
1
27.01.2020, 19:48

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

Выполнение ./ program делает именно это и требует разрешения на выполнение для файла, но не зависит от типа программы. Это может быть сценарий bash, сценарий sh, Perl, Python, awk или сценарий ожидания, или фактический двоичный исполняемый файл. Запуск программы sh заставит ее запускаться под sh , а не под чем-либо еще.

Обратите внимание, что sh отличается от bash ! Последний имеет ряд дополнительных функций, не известных стандартной оболочке. В зависимости от системы sh может быть другой программой или Bash в режиме совместимости, но результат обычно один и тот же: какие-либо дополнительные функции недоступны.

Bash сам по себе не понимает строку hashbang, но полагается на ядро ​​для ее чтения. С другой стороны, интерпретатор Perl также считывает строку hashbang самостоятельно, независимо от того, как она была запущена: он делает это, чтобы выбрать любые параметры командной строки, установленные в строке hashbang. Баш этого не делает.

Например, следующий сценарий ведет себя по-разному в зависимости от того, запущен ли он как ./ script (через exec и строку hashbang) или со сценарием bash (запуск интерпретатора bash вручную):

#!/bin/bash -u
echo $1
11
27.01.2020, 19:48

Теги

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