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

144

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

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

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

Джейк
источник
2
Shebang
drootang
2
Хорошее объяснение по askubuntu: askubuntu.com/questions/141928/…
fkoessler

Ответы:

144

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

например

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

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

Марк Б
источник
7
Обычно это ядро, а не оболочка. Оболочка просто вызывает exec()системный вызов файла.
tripleee
48

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

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

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

Фу Ба
источник
10

Если файл, в котором находится этот сценарий, является исполняемым, hash-bang ( #!) сообщает операционной системе, какой интерпретатор использовать для запуска сценария. В данном случае это /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
Stack Overflow - это не Twitter. Найдите время, чтобы на самом деле написать такие слова, как «u» и «1st». Вы помогаете написать справочник, поэтому правильная грамматика и орфография имеют большое значение. Также обратите внимание на правильное форматирование. Команды, которые будут выдаваться из командной строки, например ps, и фрагменты кода, например, #!/bin/shдолжны быть отформатированы.
Железный Человек
Я попытался очистить английский здесь, но до сих пор не понимаю, что это значит. Я предполагаю, что ответ пытается сказать, что команды в сценарии будут выполняться как отдельные команды, а добавление shebang покажет сценарий как одну команду в листинге процесса. На самом деле это не так.
Tripleee