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


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

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

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

5 118

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

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

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

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

вы также можете использовать его для передачи аргументов, обычно-e (exit on error) или использовать другие программы (/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