Що означає рядок "#! / Bin / sh" у сценарії оболонки UNIX?


142

Я переглядав кілька навчальних посібників із сценарієм оболонки і знайшов таку зразок програми:

#!/bin/sh
clear
echo "HELLO WORLD"

Хто-небудь, будь ласка, скажіть мені, яке значення має коментар #!/bin/shна початку?



2
Хороше пояснення щодо askubuntu: askubuntu.com/questions/141928/…
fkoessler


Відповіді:


143

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

напр

#!/usr/bin/perl   <--perl script'
#!/usr/bin/php <-- php script
#!/bin/false <--- do-nothing script, because false returns immediately anyways.

Він реалізований як коментар, так що все, що потрапляє в цей рядок, не буде "стосуватися" вказаного перекладача. наприклад, всі мови сценаріїв, як правило, розуміють, що рядок, що починається з #- це коментар, і ігнорують !/usr/bin/whateverчастину, що в іншому випадку може бути помилкою синтаксису в цій конкретній мові.


6
Зазвичай це ядро, а не оболонка. Оболонка просто викликає exec()системний виклик у файлі.
трійка

47

Коли ви намагаєтеся виконати програму в unix (одну із встановленим виконуваним бітом), операційна система розгляне перші кілька байтів файлу. Вони утворюють так зване "магічне число", яке можна використовувати для визначення формату програми та способів її виконання.

#!відповідає магічному номеру 0x2321 (шукайте його в таблиці ascii). Коли система бачить це магічне число, вона знає, що має справу з текстовим сценарієм і читає до наступного\n (є обмеження, але воно уникає мені атм). Визначивши перекладача (перший аргумент після шебангу), він покличе перекладача.

Інші файли також мають магічні цифри. Спробуйте подивитися растровий файл (.BMP) через, lessі ви побачите, що перші два символи є BM. Це магічне число позначає, що файл справді є растровим.


10

Якщо файл, у якому живе цей скрипт, виконується, хеш-баг ( #!) повідомляє операційній системі, який інтерпретатор використовувати для запуску сценарію. У цьому випадку це/bin/sh , наприклад.

Про це для отримання додаткової інформації є стаття у Вікіпедії .


5

Перший рядок повідомляє оболонці, що якщо ви виконаєте скрипт безпосередньо (./run.sh; на відміну від / bin / sh run.sh), він повинен використовувати цю програму (/ bin / sh у цьому випадку) для його інтерпретації.

Ви також можете використовувати його для передачі аргументів, зазвичай -e (вихід із помилкою) або використання інших програм (/ bin / awk, / usr / bin / perl тощо).


-4

#!/bin/shабо #!/bin/bashповинен бути першим рядком сценарію, тому що якщо ви не використовуєте його в першому рядку, система буде розглядати всі команди в цьому сценарії як різні команди. Якщо перший рядок, #!/bin/shто він буде розглядати всі команди як один сценарій, і він покаже, що цей файл працює в psкоманді, а не команди всередині файлу.

./echo.sh

ps -ef |grep echo
trainee   3036  2717  0 16:24 pts/0    00:00:00 /bin/sh ./echo.sh
root      3042  2912  0 16:24 pts/1    00:00:00 grep --color=auto echo

1
Переповнення стека - це не Twitter. Будь ласка, знайдіть час, щоб насправді прописати такі слова, як "u" та "1st". Ви допомагаєте написати довідник, щоб граматика та правопис були належними. Також зверніть увагу на правильне форматування. Команди, які будуть видані з командного рядка, як ps, і витяги з коду , як , наприклад, #!/bin/shповинні бути відформатовані.
Олов'яний чоловік

Я спробував почистити англійську тут, але я все ще не впевнений, що це означає. Я думаю, що відповідь намагається сказати, що команди в скрипті будуть виконуватися як окремі команди, а додавання шебанга покаже сценарій як єдину команду в списку процесів. Це насправді не так.
трійка
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.