Почему "она взрыва" начинается с #!
, как #!/bin/bash
? Я всегда соглашался с тем, как это делается, но есть ли причина для этого?
Зачем начинать с #
; разве это обычно не комментарий? Или дело в комментариях?
Почему "она взрыва" начинается с #!
, как #!/bin/bash
? Я всегда соглашался с тем, как это делается, но есть ли причина для этого?
Зачем начинать с #
; разве это обычно не комментарий? Или дело в комментариях?
Ответы:
Обычно shebang относится только к #!
( !
обычно называется «bang», и похоже, что «she» является искажением «SHArp» или «haSH» #
) - вся строка называется строкой shebang
Он намеренно начинается с символа комментария для обратной совместимости с вещами, которые не знают, как с этим справиться; по- !
видимому, просто отличить его от случайного комментария, начинающего файл, поэтому файл, который начинается с # this is my script!
, не пытается запустить this is my script!
интерпретатор
!
часто используется в других контекстах, чтобы указать команду, которая будет выполнена. Например, в vim
или в других программах с их собственными командными строками взрыв часто является escape-символом, который заставляет их выполнять команду в системной оболочке вместо их внутреннего интерфейса.
Чтобы понять это, вы должны понимать, что первая строка скрипта фактически читается дважды , двумя разными программами. В первый раз ядро открывает файл и ищет последовательность символов ( #!
) в первой строке. Если он находит его, он запускает указанную там программу оболочки, передавая имя файла в качестве параметра. (например, если файл /home/me/foo
начинается с #!/bin/sh
, ядро запустится /bin/sh /home/me/foo
).
Затем оболочка ( bin/sh
или любая другая программа-интерпретатор) считывает файл. Оболочка ничего не знает о строках shebang, но все равно будет читать первую строку, потому что она такая же, как любая другая строка в файле ... она читает их все. Вы не хотите, чтобы оболочка вызывала сбой или каким-либо образом изменяла свое поведение ... способ сделать это состоит в том, чтобы воспринимать это как комментарий и игнорировать его. Таким образом, лучшим символом для начала инструкции ядра будет символ комментария.
Это должен быть комментарий, потому что только так он будет работать для запуска скрипта, такого как "имя_символа имени сценария". Я не знаю о происхождении "!"
#!
(насколько помнит dmr…), включая объяснение того, почему#
(да, линия должна была игнорироваться существующими оболочками).