Что означает строка "#! / Bin / sh" в сценарии оболочки UNIX? - PullRequest
133 голосов
/ 09 сентября 2011

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

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

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

Ответы [ 5 ]

134 голосов
/ 09 сентября 2011

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

, например

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

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

43 голосов
/ 10 сентября 2011

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

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

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

8 голосов
/ 09 сентября 2011

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

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

5 голосов
/ 09 сентября 2011

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

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

0 голосов
/ 07 января 2015

#!/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
...