4

Во многих сценариях Apple/Unix я вижу материал, перед которым стоит «#», что, насколько я знаю, означает, что это замечание. Однако часто вы видите вызовы оболочки, как показано ниже (строка с #!).

## Setting a default route 
#!/bin/sh

/sbin/route add SUBNET $5

Я задаюсь вопросом, является ли это также просто комментарием или это действительно что-то делает. Спасибо за совет ваших экспертов :-)

2 ответа2

16

Это способ определить, какая оболочка должна вызываться во время выполнения скрипта. Это называется Шебанг.

Пример, файл, имеющий следующую строку Shebang:

#!/bin/sh

будет вызывать оболочку Bourne (sh). Так, например, ваш кусок сценария:

## Setting a default route 
#!/bin/sh

/sbin/route add SUBNET $5

заставит /sbin/route add SUBNET $5 в интерпретаторе оболочки Bourne. /sbin/route add SUBNET $5 - просто комментарий и ничего не делает. Тем не менее, шебанг должен быть в первой строке, поэтому этот комментарий в верхней части запретит шебангу выполнять свою работу, делая его бесполезным дополнением.

Существует ряд широко используемых интерпретаторов, и некоторые типичные интерпретаторы строк Шебанга:

  • #!/bin/sh - выполнить с использованием sh, оболочки Bourne (или совместимой оболочки)
  • #!/bin/csh - выполнить с использованием csh, оболочки C (или совместимой оболочки)
  • #!/usr/bin/perl - выполнить с помощью Perl
  • #!/usr/bin/python - выполнить с использованием Python
  • #!/usr/bin/php - выполнить с использованием интерпретатора командной строки PHP

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

4

Несколько более техническое объяснение:

Когда вы запускаете исполняемый файл в UNIX/Linux/Windows/SomeOS/AnyOS, система должна знать, как его запустить. В UNIX/Linux есть специальные правила для первых нескольких байтов файлов, чтобы сообщить ядру, как его запустить. Для сценариев специальными символами являются '#!». Если ядро видит это как первые два символа, оно знает, что файл является скриптом, и просматривает оставшуюся часть строки для исполняемого файла, запускающего скрипт. Итак, если файл /path/to/script.sh запускается:

#!/bin/sh

Ядро увидит '#!', знайте, что это скрипт, найдите и запустите /bin /sh и передайте путь к файлу скрипта /path/to/script.sh в качестве параметра. Поскольку все интерпретаторы сценариев (bash, perl, csh, python и т.д.) Используют «#» в качестве символа комментария, они все просто проигнорируют эту строку « shebang » в качестве комментария.

Вы, вероятно, никогда не видели этого раньше, потому что Windows обрабатывает это совершенно по-другому. В Windows он не использует эти «волшебные» символы, а вместо этого сопоставляет расширение файла с способом его запуска.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .