Зачем вам нужно ставить #! / Bin / bash в начале файла скрипта?

316

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

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

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

  • 8
    Вам не нужно и не нужно, если у вас нет выбора. Используйте «#! / Bin / sh», чтобы узнать разницу между оболочкой (POSIX) и bash. Придет день, прежде чем ваше резюме станет слишком длинным, когда вы окажетесь в системе с другой оболочкой и захотите, чтобы ваши скрипты работали.
  • 35
    Это произносится как "Hash-Bang" или "She-Bang".
Показать ещё 3 комментария
Теги:
scripting

8 ответов

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

Это соглашение, так что оболочка * 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.

  • 1
    Я узнал о чем-то еще полезном, $ #. Как это называется?
  • 81
    Шебанг не является соглашением оболочки , он интерпретируется ядром при обработке execve(2) вызова execve(2) ; так что шебанг - это соглашение ядра , а не оболочка.
Показать ещё 5 комментариев
99

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

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

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

 #!/usr/bin/env python

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

  • 8
    Смотрите этот вопрос для обсуждения взлома #!/usr/bin/env .
  • 0
    если я хочу передать аргумент python, как мне это сделать, на самом деле я хочу выполнить #!/usr/bin/env bash -x . Как я могу это сделать ?
Показать ещё 2 комментария
38

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

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

  • 1
    Если я уже в bash, запускается ли другой экземпляр bash, если он видит #! / Bin / bash? Что делать, если я уже в Bash, и я оставлю это? Есть ли разница?
  • 2
    @javascriptninja в любом случае запускает новую оболочку bash. В случае bash на самом деле нет никакой разницы, если вы уже используете bash. Шебанг действительно имеет значение, только если (а) вам нужно запустить что-то, что не является просто оболочкой, например, python или perl, или (б) вы не используете оболочку bash (т.е. вы используете zsh), но вам нужно запустить то, что требует запуска в bash.
Показать ещё 5 комментариев
15

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

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

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

13

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

12

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

Bash развивается с годами с кодом ksh и sh.

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

#! часто упоминается как "хеширование", "she-bang" или "sha-bang".

8

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

0

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

Ещё вопросы

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