Я сделал Bash скрипты раньше, и все они отлично работали без этого в начале. В чем смысл его вставить? Все будет по-другому?
Также, как вы произносите #
? Я знаю, что !
произносится как "взрыв".
Как произносится #!
?
Я сделал Bash скрипты раньше, и все они отлично работали без этого в начале. В чем смысл его вставить? Все будет по-другому?
Также, как вы произносите #
? Я знаю, что !
произносится как "взрыв".
Как произносится #!
?
Это соглашение, так что оболочка * nix знает, какой интерпретатор запускается.
Например, более старые ароматы ATT по умолчанию равны sh (оболочка Bourne), а более старые версии BSD по умолчанию - csh (оболочка C).
Даже сегодня (где большинство систем работают bash, "Bourne Again Shell" ), скрипты могут быть в bash, python, perl, ruby, PHP и т.д. и т.д. Например, вы можете увидеть #!/bin/perl
или #!/bin/perl5
.
PS:
Восклицательный знак (!
) ласково называется "ударом". Символ комментария оболочки (#
) иногда называют хешем.
PPS:
Помните - под * nix, связывание суффикса с типом файла - это просто соглашение, а не "правило". Исполняемый файл может быть двоичной программой, любым из миллионов типов script и другими вещами. Отсюда необходимость #!/bin/bash
.
Чтобы быть более точным shebang #!
, когда это первые два байта исполняемого файла (x
mode), интерпретируется execve (2) системный вызов (который выполняет программы). Но спецификация POSIX для execve
не упоминает shebang.
За ним должен следовать путь к файлу исполняемого файла интерпретатора (который BTW может быть даже относительным, но чаще всего является абсолютным).
Хороший трюк (или, возможно, не очень приятный), чтобы найти интерпретатора (например, python
) в пользовательском $PATH
- использовать env
(всегда на /usr/bin/env
на всех Linux), например,
#!/usr/bin/env python
Любой исполняемый файл ELF может быть интерпретатором. Вы даже можете использовать #!/bin/cat
или #!/bin/true
, если хотите! (но это было бы часто бесполезно)
Он называется shebang. В unix-talk, # называется резким (как в музыке) или хэшем (например, хэштеги на твиттере), и! называется bang. (Вы можете ссылаться на свою предыдущую команду оболочки с помощью!!, называемой bang-bang). Поэтому, когда вы собраны вместе, вы получаете haSH-BANG или shebang.
Часть после #! сообщает Unix, какую программу использовать для ее запуска. Если он не указан, он попытается использовать bash (или sh, или zsh, или любую другую переменную $SHELL), но если он там будет использовать эту программу. Кроме того, # является комментарием на большинстве языков, поэтому при последующем выполнении строка игнорируется.
shebang является дирекцией загрузчика использовать программу, указанную после #!
, в качестве интерпретатора для рассматриваемого файла, когда вы пытаетесь для его выполнения. Итак, если вы попытаетесь запустить файл с именем foo.sh
, который имеет #!/bin/bash
вверху, фактическая команда, которая запускается, /bin/bash foo.sh
. Это гибкий способ использования разных интерпретаторов для разных программ. Это что-то реализовано на системном уровне, а API уровня пользователя - это соглашение shebang.
Также стоит знать, что shebang - магический номер - читаемый человеком, который идентифицирует файл как script для данного интерпретатора.
Ваша мысль об этом "работает" даже без shebang только потому, что рассматриваемая программа представляет собой оболочку script, написанную для той же оболочки, что и тот, который вы используете. Например, вы можете написать файл javascript, а затем поставить #! /usr/bin/js
(или что-то подобное) на javascript "Shell script".
Операционная система использует оболочку по умолчанию для запуска оболочки script. поэтому, ссылаясь на путь оболочки в начале script, вы просите ОС использовать эту конкретную оболочку. Это также полезно для portability.
Каждое распределение имеет оболочку по умолчанию. Bash по умолчанию используется для большинства систем. Если вы работаете с системой, которая имеет другую оболочку по умолчанию, тогда сценарии могут работать не так, как предполагалось, если они написаны специально для Bash.
Bash развивается с годами с кодом ksh
и sh
.
Добавление #!/bin/bash
в качестве первой строки вашего script, сообщает ОС о вызове указанного shell
для выполнения команд, которые следуют в script.
#!
часто упоминается как "хеширование", "she-bang" или "sha-bang".
Он называется shebang. Он состоит из знака числа и символа восклицательного знака (#!), За которым следует полный путь к интерпретатору, например /bin/ bash. Все сценарии под UNIX и Linux выполняются с использованием интерпретатора, указанного в первой строке.
Это может быть полезно для тех, кто использует другую систему, которая не имеет доступной библиотеки. Если это не объявлено, и у вас есть некоторые функции в script, которые не поддерживаются этой системой, вы должны объявить #/bin/bash. Я столкнулся с этой проблемой прежде, чем на работе, и теперь я просто включаю ее в практику.