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

101

Я проходил через несколько учебных пособий script и нашел следующую примерную программу:

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

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

Показать ещё 2 комментария
Теги:
sh
shebang

5 ответов

103
Лучший ответ

Он называется shebang и сообщает родительской оболочке, что интерпретатор должен использоваться для выполнения script.

например.

#!/usr/bin/perl   <--perl script'
#!/usr/bin/php <-- PHP скрипт
#!/bin/false <--- do-nothing script, because false returns immediately anyways.

Он реализован как комментарий, так что все, что попадает в эту строку, не будет "релевантным" для указанного интерпретатора. например все языки сценариев, как правило, понимают, что строка, начинающаяся с #, является комментарием, и будет игнорировать часть !/usr/bin/whatever, которая в противном случае могла бы быть синтаксической ошибкой на этом конкретном языке.

  • 3
    Обычно это ядро, а не оболочка, которая обрабатывает это. Оболочка просто вызывает системный вызов exec() для файла.
38

Когда вы пытаетесь выполнить программу в unix (один с установленным битом), операционная система будет смотреть на первые несколько байтов файла. Они образуют так называемое "магическое число", которое можно использовать для определения формата программы и способа ее выполнения.

#! соответствует магическому числу 0x2321 (посмотрите в таблице ascii). Когда система видит магическое число, он знает, что имеет дело с текстом script и читает до следующего \n (есть предел, но он ускользает от меня atm). Определив интерпретатор (первый аргумент после shebang), он будет вызывать интерпретатор.

Другие файлы также имеют магические числа. Попробуйте посмотреть файл растрового изображения (.BMP) через less, и вы увидите первые два символа: BM. Это магическое число означает, что файл действительно является растровым изображением.

7

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

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

4

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

Вы также можете использовать его для передачи аргументов, обычно -e (выход при ошибке), или использовать другие программы (/bin/awk,/usr/bin/perl и т.д.).

-2

#!/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
  • 1
    Переполнение стека не Twitter. Пожалуйста, найдите время, чтобы фактически разобрать слова, такие как «U» и «1-й». Вы помогаете написать справочник, чтобы правильная грамматика и орфография были важны. Также обратите внимание на правильное форматирование. Команды, которые будут выдаваться из командной строки, такие как ps , и выдержки из кода, такие как #!/bin/sh должны быть отформатированы.
  • 0
    Я пытался очистить английский здесь, но я все еще не уверен, что это значит. Я предполагаю, что в ответе говорится, что команды в сценарии будут выполняться как отдельные команды, а при добавлении shebang сценарий будет показан как одна команда в списке процессов. Это не совсем так.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню