Он реализован как комментарий, так что все, что находится в этой строке, не будет «относиться» к указанному интерпретатору. например, все языки сценариев склонны понимать, что строка, начинающаяся с #комментария, и игнорировать !/usr/bin/whateverчасть, которая в противном случае могла бы быть синтаксической ошибкой для этого конкретного языка.
Обычно это ядро, а не оболочка. Оболочка просто вызывает exec()системный вызов файла.
tripleee
48
Когда вы пытаетесь выполнить программу в 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команде, а не команды внутри файла.
Stack Overflow - это не Twitter. Найдите время, чтобы на самом деле написать такие слова, как «u» и «1st». Вы помогаете написать справочник, поэтому правильная грамматика и орфография имеют большое значение. Также обратите внимание на правильное форматирование. Команды, которые будут выдаваться из командной строки, например ps, и фрагменты кода, например, #!/bin/shдолжны быть отформатированы.
Железный Человек
Я попытался очистить английский здесь, но до сих пор не понимаю, что это значит. Я предполагаю, что ответ пытается сказать, что команды в сценарии будут выполняться как отдельные команды, а добавление shebang покажет сценарий как одну команду в листинге процесса. На самом деле это не так.
Ответы:
Он называется 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
. Это магическое число означает, что файл действительно является растровым изображением.источник
Если файл, в котором находится этот сценарий, является исполняемым, 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
команде, а не команды внутри файла../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
должны быть отформатированы.