Я проходил через несколько учебных пособий script и нашел следующую примерную программу:
#!/bin/sh
clear
echo "HELLO WORLD"
Может ли кто-нибудь рассказать, в чем смысл упоминания "!/bin/sh
" в комментарии?
Я проходил через несколько учебных пособий script и нашел следующую примерную программу:
#!/bin/sh
clear
echo "HELLO WORLD"
Может ли кто-нибудь рассказать, в чем смысл упоминания "!/bin/sh
" в комментарии?
Он называется shebang и сообщает родительской оболочке, что интерпретатор должен использоваться для выполнения script.
например.
#!/usr/bin/perl <--perl script'
#!/usr/bin/php <-- PHP скрипт
#!/bin/false <--- do-nothing script, because false returns immediately anyways.
Он реализован как комментарий, так что все, что попадает в эту строку, не будет "релевантным" для указанного интерпретатора. например все языки сценариев, как правило, понимают, что строка, начинающаяся с #
, является комментарием, и будет игнорировать часть !/usr/bin/whatever
, которая в противном случае могла бы быть синтаксической ошибкой на этом конкретном языке.
Когда вы пытаетесь выполнить программу в unix (один с установленным битом), операционная система будет смотреть на первые несколько байтов файла. Они образуют так называемое "магическое число", которое можно использовать для определения формата программы и способа ее выполнения.
#!
соответствует магическому числу 0x2321 (посмотрите в таблице ascii). Когда система видит магическое число, он знает, что имеет дело с текстом script и читает до следующего \n
(есть предел, но он ускользает от меня atm). Определив интерпретатор (первый аргумент после shebang), он будет вызывать интерпретатор.
Другие файлы также имеют магические числа. Попробуйте посмотреть файл растрового изображения (.BMP) через less
, и вы увидите первые два символа: BM
. Это магическое число означает, что файл действительно является растровым изображением.
Если файл, в котором находится этот script, является исполняемым, хэш-бит (#!
) сообщает операционной системе, какой интерпретатор должен использовать для запуска script. В этом случае это, например, /bin/sh
.
Здесь статья Википедии об этом для получения дополнительной информации.
Первая строка сообщает оболочке, что если вы выполняете непосредственно script (./run.sh; в отличие от /bin/sh run.sh), она должна использовать эту программу (/bin/sh в этом случае ) для его интерпретации.
Вы также можете использовать его для передачи аргументов, обычно -e (выход при ошибке), или использовать другие программы (/bin/awk,/usr/bin/perl и т.д.).
#!/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