it-roy-ru.com

Что означает строка "#! / Bin / sh" в сценарии оболочки UNIX?

Я просматривал некоторые учебники по сценариям Shell и нашел следующий пример программы:

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

Может кто-нибудь сказать, в чем смысл упоминания "!/bin/sh" в комментарии?

132
Jake

Он называется Shebang и сообщает родительской оболочке, какой интерпретатор следует использовать для выполнения сценария.

например.

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

Он реализован в виде комментария, так что все, что находится в этой строке, не будет "соответствовать" указанному интерпретатору. например все языки сценариев склонны понимать, что строка, начинающаяся с #, является комментарием и игнорирует часть !/usr/bin/whatever, которая в противном случае могла бы быть синтаксической ошибкой в ​​этом конкретном языке.

132
Marc B

Когда вы пытаетесь выполнить программу в Unix (ту, в которой установлен исполняемый бит), операционная система просматривает первые несколько байтов файла. Они образуют так называемое "магическое число", которое можно использовать для определения формата программы и способа ее выполнения.

#! соответствует магическому номеру 0x2321 (ищите его в таблице ascii). Когда система видит это магическое число, она знает, что имеет дело с текстовым скриптом, и читает до следующего \n (есть предел, но он ускользает от меня). После определения переводчика (первый аргумент после Шебанга) он вызовет переводчика.

Другие файлы также имеют магические числа. Попробуйте посмотреть файл растрового изображения (.BMP) через less, и вы увидите, что первые два символа - BM. Это магическое число обозначает, что файл действительно является растровым изображением.

43
Foo Bah

Если файл, в котором находится этот сценарий, является исполняемым, hash-bang (#!) сообщает операционной системе, какой интерпретатор использовать для запуска сценария. В этом случае это /bin/sh, например.

Существует статья в Википедии об этом для получения дополнительной информации.

8
Kusalananda

Первая строка сообщает Shell, что если вы выполняете скрипт напрямую (./run.sh; в отличие от/bin/sh run.sh), он должен использовать эту программу (/ bin/sh в данном случае) для его интерпретации.

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

5
Kevin