Зачем нужно ставить #!/bin / bash в начале файла сценария?

Я сделал Баш скрипты раньше, и все они работали нормально без этого в начале. Какой смысл в этом? Будет ли все по-другому?

кроме того, как вы произносите #? Я знаю это ! произносится как " bang."

как #! произносится?

8 ответов


это соглашение, поэтому оболочка *nix знает, какой интерпретатор запускать.

например, старые ароматы ATT по умолчанию ш (оболочка Борна), в то время как более старые версии BSD по умолчанию csh (оболочка C).

даже сегодня (где большинство систем работают bash, "Борн Снова Шелл"), скрипты могут быть в bash, python, perl, ruby, PHP и т. д. Например, вы можете увидеть #!/bin/perl или #!/bin/perl5.

PS: Этот восклицательный знак (!) ласково называют "взрыва". Символ комментария оболочки (#) иногда называют "хэш".

PPS: Помните-под *nix, связывание суффикса с типом файла-это просто , а не "правила". Ан исполняемый файл может быть двоичной программой, любой из миллиона типов скриптов и других вещей. Отсюда необходимость #!/bin/bash.


точнее shebang #!, когда это первые два байта исполняемый файл (x режим файл), интерпретируется execve (2) системный вызов (который выполняет программы). Но!--19-->спецификация POSIX для execve не упоминайте о shebang.

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

хороший трюк (или, возможно,не так приятно one), чтобы найти интерпретатор (например,python) в $PATH использовать


Это называется shebang. В unix-speak # называется sharp (как в музыке) или hash (как хэштеги в twitter), and ! называется Банг. (Вы можете фактически ссылаться на свою предыдущую команду shell !!, называется бац-бац). Поэтому, когда вы вместе, вы получаете haSH-BANG или shebang.

часть после #! сообщает Unix, какую программу использовать для ее запуска. Если он не указан, он попытается с bash (или sh, или zsh, или любой другой переменной $SHELL), но если он там, он будет использовать эту программу. Кроме того, # - это комментарий на большинстве языков, поэтому строка игнорируется при последующем выполнении.


на shebang - это директива загрузчику использовать программу, которая указана после #! в качестве интерпретатора для рассматриваемого файла при попытке его выполнения. Итак, если вы попытаетесь запустить файл с именем foo.sh имеющего #!/bin/bash вверху фактическая команда, которая выполняется, -/bin/bash foo.sh. Это гибкий способ использования различных интерпретаторов для различных программ. Это что-то реализовано на системном уровне, а API пользовательского уровня-это соглашение shebang.

также стоит знать, что shebang-это магическое число - читаемый человеком, который идентифицирует файл как сценарий для данного интерпретатора.

ваша точка зрения об этом "работает" даже без shebang только потому, что программа, о которой идет речь, является сценарием оболочки, написанным для той же оболочки, что и та, которую вы используете. Например, вы можете очень хорошо написать файл javascript, а затем поставить #! /usr/bin/js (или что-то подобное), чтобы иметь оболочку javascript сценарий."


операционная система принимает оболочку по умолчанию для запуска сценария оболочки. поэтому, упоминая путь оболочки в начале скрипта, вы просите ОС использовать эту конкретную оболочку. Это также полезно для мобильность.


каждый дистрибутив имеет оболочку по умолчанию. Bash является значением по умолчанию для большинства систем. Если вы работаете в системе с другой оболочкой по умолчанию, сценарии могут работать не так, как предполагалось, если они написаны специально для Bash.

Bash развивался на протяжении многих лет, принимая код от ksh и sh.

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

#! часто называют "хэш-Банг", "она-Банг"или" Ша-Банг".


Это называется shebang. Он состоит из знака и восклицательного знака (#!), за которым следует полный путь к интерпретатору, например /bin / bash. Все скрипты под UNIX и Linux выполняются с помощью интерпретатора, указанного в первой строке.


Это может быть полезно для тех, кто использует другую систему, которая не имеет эту библиотеку легко доступны. Если это не объявлено, и у вас есть некоторые функции в скрипте, которые не поддерживаются этой системой, вы должны объявить #/bin/bash. Я столкнулся с этой проблемой раньше на работе, и теперь я просто включаю ее в качестве практики.