Чому "вона-удар" починається з "#!"?


10

Чому "чумка" починається з #!, як #!/bin/bash? Я завжди приймав, що так це робиться, але чи є причина в цьому?

З чого починати #; це зазвичай не коментар? Або справа в тому, що це слід коментувати?


4
У Вікіпедії є досить детальна історія #!(стільки, скільки пам'ятає dmr ...), включаючи пояснення, чому #(так, рядки повинні були ігноруватися наявними оболонками).
Жил 'ТАК - перестань бути злим'

Пропущено перевірити вікіпедію :)
Йоган

1
Я просто хочу, щоб снаряди були досить розумні, щоб зняти сторонні CR / LF, якщо вони є там
;;

Відповіді:


16

Зазвичай shebang посилається на просто #!( !зазвичай називається "чуб", і схоже, що "вона" є пошкодженням або "SHArp", або "haSH" для #) - весь рядок називається лінією shebang

Це навмисно починається з символу коментаря для зворотної сумісності з речами, які не знають, як з цим впоратися; !імовірно просто , щоб відрізнити його від випадкового коментаря початку файлу, тому файл , який починається з # this is my script!не намагається запустити this is my script!інтерпретатор


2
Чанг !часто використовується в інших контекстах для позначення команди, яку потрібно виконати. Наприклад, в vimабо інших програмах з власними командними рядками, чуб часто є символом втечі, який змушує їх виконувати команду в системній оболонці замість їх внутрішнього інтерфейсу.
Калеб

4

Щоб зрозуміти це, ви повинні усвідомити, що перший рядок сценарію насправді читається двічі , двома різними програмами. Перший раз ядро ​​відкриває файл і шукає цю послідовність символів ( #!) у першому рядку. Якщо він його знайде, він запускає програму оболонки, яка там вказана, передаючи ім'я файлу як параметр. (наприклад, якщо файл /home/me/fooпочинається з #!/bin/sh, ядро ​​запуститься /bin/sh /home/me/foo).

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


Це дійсно ядро, що це робить, це здається, що це поточна оболонка, в якій ви працюєте, буде розбирати шебанг, а потім натискати сценарій
Йохан

Ні ... це саме ядро, живе і особисто. Він буде працювати, навіть якщо ви не використовуєте оболонку для виконання сценарію ... Є інші способи виконання файлу, крім оболонки ... наприклад, із програми C, використовуючи системний виклик "exec"
JoelFan

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

1

Це має бути коментарем, оскільки тільки таким чином він також буде працювати для запуску сценарію на зразок "interpretername scriptname". Я не знаю про походження "!".


1
Навіть якщо ви просто запустите ./scriptname, інтерпретатор все ще бачить лінію she-bang, тому це все одно має бути коментарем.
psusi

1
Або якщо бути більш детальним: shebang: '#!' розроблений так, щоб не переглянувся перекладачем - таким чином, він повинен починатися з char коментаря "#". Натомість ядро ​​"exec [lv] *" ядра "бачиться" (і інтерпретується) системними викликами.
аріельф
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.