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

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

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

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

Ответ 1

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

например.

#!/usr/bin/perl   <--perl script'
#!/usr/bin/php <-- PHP скрипт
#!/bin/false <--- do-nothing script, because false returns immediately anyways.

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

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

#!/bin/sh или #!/bin/bash должна быть первой строкой script, потому что если вы не используете ее в первой строке, система будет обрабатывать все команды в этом script как разные команды. Если первая строка #!/bin/sh, тогда она рассмотрит все команды как один script и покажет, что этот файл работает в команде 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