Зачем вам нужно ставить #! / Bin / bash в начале файла скрипта? - PullRequest
441 голосов
/ 23 января 2012

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

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

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

Ответы [ 9 ]

386 голосов
/ 23 января 2012

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

Например, старые версии ATT по умолчанию имеют значение sh (оболочка Bourne), а старые версиидля BSD по умолчанию установлено значение csh (оболочка C).

Даже сегодня (где большинство систем запускают bash, "Bourne Again Shell" ) сценарии могут находиться вbash, python, perl, ruby, PHP и т. д. и т. д. Например, вы можете увидеть #!/bin/perl или #!/bin/perl5.

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

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

123 голосов
/ 23 января 2012

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

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

Хорошая уловка (или, возможно, не очень хороший один), чтобы найти переводчика (например, python) в пользовательском $PATH, заключается в использовании программы env(всегда на /usr/bin/env на всех Linux) как например

 #!/usr/bin/env python

Любой исполняемый файл ELF может быть интерпретатором.Вы даже можете использовать #!/bin/cat или #!/bin/true, если хотите!(но это было бы часто бесполезно)

47 голосов
/ 23 января 2012

Это называется шебанг .В Unix-говорят, # называется острым (как в музыке) или хэш (как хэштеги в твиттере), и!называется взрыв.(Вы можете сослаться на свою предыдущую команду оболочки с помощью команды !!, называемой bang-bang).Поэтому, когда вы соберетесь вместе, вы получите ха-бэнг или шебанг.

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

16 голосов
/ 23 января 2012

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

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

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

16 голосов
/ 23 января 2012

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

14 голосов
/ 23 января 2012

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

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

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

#! часто называют «хэш-бэнг», «шэ-бэнг» или «ша-бэнг».

9 голосов
/ 23 января 2012

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

1 голос
/ 04 апреля 2019

Также вы увидите некоторые другие параметры после #! / Bin / bash, например,
#!/bin/bash -v -x
прочитайте это, чтобы получить больше идей.
https://unix.stackexchange.com/questions/124272/what-do-the-arguments-v-and-x-mean-to-bash.

0 голосов
/ 21 июля 2013

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

...