Почему «она взрыва» начинается с «#!»?


10

Почему "она взрыва" начинается с #!, как #!/bin/bash? Я всегда соглашался с тем, как это делается, но есть ли причина для этого?

Зачем начинать с #; разве это обычно не комментарий? Или дело в комментариях?


4
Википедия имеет довольно подробную историю #!(насколько помнит dmr…), включая объяснение того, почему #(да, линия должна была игнорироваться существующими оболочками).
Жиль "ТАК - перестань быть злым"

Пропустил проверить википедию :)
Йохан

1
Я просто хотел бы, чтобы снаряды были достаточно умными, чтобы раздеть посторонний CR / LF, если он там есть ...;)
Аарон Д. Мараско

Ответы:


16

Обычно shebang относится только к #!( !обычно называется «bang», и похоже, что «she» является искажением «SHArp» или «haSH» #) - вся строка называется строкой shebang

Он намеренно начинается с символа комментария для обратной совместимости с вещами, которые не знают, как с этим справиться; по- !видимому, просто отличить его от случайного комментария, начинающего файл, поэтому файл, который начинается с # this is my script!, не пытается запустить this is my script!интерпретатор


2
Взрыв !часто используется в других контекстах, чтобы указать команду, которая будет выполнена. Например, в vimили в других программах с их собственными командными строками взрыв часто является escape-символом, который заставляет их выполнять команду в системной оболочке вместо их внутреннего интерфейса.
Калеб

4

Чтобы понять это, вы должны понимать, что первая строка скрипта фактически читается дважды , двумя разными программами. В первый раз ядро ​​открывает файл и ищет последовательность символов ( #!) в первой строке. Если он находит его, он запускает указанную там программу оболочки, передавая имя файла в качестве параметра. (например, если файл /home/me/fooначинается с #!/bin/sh, ядро ​​запустится /bin/sh /home/me/foo).

Затем оболочка ( bin/shили любая другая программа-интерпретатор) считывает файл. Оболочка ничего не знает о строках shebang, но все равно будет читать первую строку, потому что она такая же, как любая другая строка в файле ... она читает их все. Вы не хотите, чтобы оболочка вызывала сбой или каким-либо образом изменяла свое поведение ... способ сделать это состоит в том, чтобы воспринимать это как комментарий и игнорировать его. Таким образом, лучшим символом для начала инструкции ядра будет символ комментария.


Это действительно ядро, которое делает это, похоже, что текущая оболочка, в которой вы работаете, будет анализировать shebang, а затем выдвигать сценарий
Johan

Нет ... это само ядро, живи и лично. Он будет работать, даже если вы не используете оболочку для выполнения сценария ... есть другие способы выполнить файл помимо оболочки ... например, из программы на C, используя системный вызов exec
JoelFan

en.wikipedia.org/wiki/Shebang_(Unix)#Magic_number "#!" в ascii - байты 0x23 0x21 - когда exec () видит эти байты, поведение заключается в том, чтобы рассматривать остальную часть строки как путь к интерпретатору.
Аарон Макмиллин

1

Это должен быть комментарий, потому что только так он будет работать для запуска скрипта, такого как "имя_символа имени сценария". Я не знаю о происхождении "!"


1
Даже если вы просто запустите ./scriptname, интерпретатор все равно увидит чертову линию, поэтому он все равно должен быть комментарием.
псуси

1
Или, если быть более подробным: Шебанг: «#!» разработан так, чтобы интерпретатор не видел его, поэтому он должен начинаться с комментария char '#'. Вместо этого он «виден» (и интерпретируется) системой системных вызовов «exec [lv] *» ядра.
Ариэльф
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.