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


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.