Чому "чумка" починається з #!
, як #!/bin/bash
? Я завжди приймав, що так це робиться, але чи є причина в цьому?
З чого починати #
; це зазвичай не коментар? Або справа в тому, що це слід коментувати?
Чому "чумка" починається з #!
, як #!/bin/bash
? Я завжди приймав, що так це робиться, але чи є причина в цьому?
З чого починати #
; це зазвичай не коментар? Або справа в тому, що це слід коментувати?
Відповіді:
Зазвичай shebang посилається на просто #!
( !
зазвичай називається "чуб", і схоже, що "вона" є пошкодженням або "SHArp", або "haSH" для #
) - весь рядок називається лінією shebang
Це навмисно починається з символу коментаря для зворотної сумісності з речами, які не знають, як з цим впоратися; !
імовірно просто , щоб відрізнити його від випадкового коментаря початку файлу, тому файл , який починається з # this is my script!
не намагається запустити this is my script!
інтерпретатор
!
часто використовується в інших контекстах для позначення команди, яку потрібно виконати. Наприклад, в vim
або інших програмах з власними командними рядками, чуб часто є символом втечі, який змушує їх виконувати команду в системній оболонці замість їх внутрішнього інтерфейсу.
Щоб зрозуміти це, ви повинні усвідомити, що перший рядок сценарію насправді читається двічі , двома різними програмами. Перший раз ядро відкриває файл і шукає цю послідовність символів ( #!
) у першому рядку. Якщо він його знайде, він запускає програму оболонки, яка там вказана, передаючи ім'я файлу як параметр. (наприклад, якщо файл /home/me/foo
починається з #!/bin/sh
, ядро запуститься /bin/sh /home/me/foo
).
Далі оболонка ( bin/sh
або будь-яка програма перекладача була визначена) читає файл. Оболонка нічого не знає про рядки shebang, але вона все одно буде читати перший рядок, тому що це як і будь-який інший рядок у файлі ... вона читає їх усі. Ви не хочете, щоб оболонка руйнувалась чи змінювала її поведінку будь-яким способом ... спосіб зробити це - це ставитись до цього як коментар та ігнорувати його. Таким чином, найкращим символом для інструкції ядра для початку буде символ коментаря.
Це має бути коментарем, оскільки тільки таким чином він також буде працювати для запуску сценарію на зразок "interpretername scriptname". Я не знаю про походження "!".
#!
(стільки, скільки пам'ятає dmr ...), включаючи пояснення, чому#
(так, рядки повинні були ігноруватися наявними оболонками).