Что делает строка"#!/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 (есть предел, но он ускользает от меня атм). Определив интерпретатор (первый аргумент после shebang), он вызовет интерпретатора.

другие файлы также имеют магические числа. Попробуйте посмотреть на растровое изображение (.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 command, а не команды внутри файла.

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