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