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

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

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

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

5 ответов

Решение

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

например

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

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

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

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

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

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

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

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

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

#!/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
Другие вопросы по тегам