Зачем вам нужно ставить #!/ Bin/bash в начале файла скрипта?
Я делал сценарии Bash раньше, и все они без проблем работали в начале. Какой смысл вкладывать это в? Будет ли что-то по-другому?
Кроме того, как вы произносите #
? я знаю это !
произносится как "взрыв".
Как #!
произносятся?
10 ответов
Это соглашение, поэтому оболочка *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
,
Чтобы быть более точным, Шебанг #!
когда это первые два байта исполняемого файла (x
mode), интерпретируется системным вызовом execve(2) (который выполняет программы). Но спецификация POSIX дляexecve
не упоминай шебанг
За ним должен следовать путь к файлу исполняемого файла интерпретатора (что, кстати, может даже быть относительным, но чаще всего абсолютным).
Хороший трюк (или, возможно, не такой хороший), чтобы найти переводчика (например, python
) в пользователе $PATH
это использовать env
программа (всегда в /usr/bin/env
на всех Linux) как например
#!/usr/bin/env python
Любой исполняемый файл ELF может быть интерпретатором. Вы могли бы даже использовать #!/bin/cat
или же #!/bin/true
если бы ты хотел! (но это было бы часто бесполезно)
Это называется шебанг. В Unix-говорят, # называется острым (как в музыке) или хэш (как хэштеги в твиттере), и! называется взрыв. (Вы можете сослаться на свою предыдущую команду оболочки с помощью команды!!, которая называется bang-bang). Поэтому, когда вы соберетесь вместе, вы получите ха-бэнг или шебанг.
Часть после #! сообщает Unix, какую программу использовать для его запуска. Если он не указан, он попытается использовать bash (или sh, или zsh, или любую другую переменную $SHELL), но если она там, она будет использовать эту программу. Кроме того, # - это комментарий на большинстве языков, поэтому строка при последующем выполнении игнорируется.
Каждый дистрибутив имеет оболочку по умолчанию. Bash используется по умолчанию в большинстве систем. Если вы работаете в системе с другой оболочкой по умолчанию, сценарии могут работать не так, как задумано, если они написаны специально для Bash.
Bash развивался годами, принимая код от ksh
а также sh
,
Добавление #!/bin/bash
как первая строка вашего скрипта, говорит операционной системе, чтобы вызвать указанный shell
выполнить команды, которые следуют в сценарии.
#!
часто упоминается как "хэш-бэнг", "она-бэнг" или "ша-бэнг".
Операционная система использует оболочку по умолчанию для запуска вашего сценария оболочки. поэтому, упомянув путь к оболочке в начале скрипта, вы просите ОС использовать именно эту оболочку. Это также полезно для мобильности.
Shebang - это указание загрузчику использовать программу, указанную после #!
в качестве интерпретатора для рассматриваемого файла, когда вы пытаетесь выполнить его. Итак, если вы попытаетесь запустить файл с именем foo.sh
у которого есть #!/bin/bash
на самом деле, текущая команда, которая выполняется /bin/bash foo.sh
, Это гибкий способ использования разных переводчиков для разных программ. Это то, что реализовано на системном уровне, а API уровня пользователя - это соглашение Шебанга.
Также стоит знать, что шебанг - это магическое число - читаемое человеком, которое идентифицирует файл как скрипт для данного интерпретатора.
Ваша точка зрения о том, что он "работает" даже без шебанга, заключается только в том, что рассматриваемая программа является сценарием оболочки, написанным для той же оболочки, что и та, которую вы используете. Например, вы могли бы очень хорошо написать файл JavaScript, а затем поставить #! /usr/bin/js
(или что-то подобное), чтобы иметь JavaScript "Shell скрипт".
Это называется шебанг. Он состоит из знака числа и символа восклицательного знака (#!), За которым следует полный путь к интерпретатору, например /bin/bash. Все сценарии в UNIX и Linux выполняются с использованием интерпретатора, указанного в первой строке.
Стандарты Bash для «оболочки Bourne-Again» - это лишь один из многих типов оболочек, доступных в Linux.
Оболочка - это интерпретатор командной строки, который принимает и запускает команды.
Bash часто является оболочкой по умолчанию в большинстве дистрибутивов Linux. Вот почему bash является синонимом оболочки.
Сценарии оболочки часто имеют почти одинаковый синтаксис, но иногда они различаются. Например, индекс массива начинается с 1 в Zsh вместо 0 в bash. Сценарий, написанный для оболочки Zsh, не будет работать так же в bash, если в нем есть массивы.
Чтобы избежать неприятных сюрпризов, вы должны сообщить интерпретатору, что ваш сценарий оболочки написан для оболочки bash. Как ты это делаешь?
просто начните свой сценарий bash в #!/bin/bash
Также вы увидите некоторые другие параметры после #!/ Bin/bash, например#!/bin/bash -v -x
прочтите это, чтобы получить больше информации.
https://unix.stackexchange.com/questions/124272/what-do-the-arguments-v-and-x-mean-to-bash.
Это может быть полезно для тех, кто использует другую систему, для которой эта библиотека не доступна. Если это не объявлено, и в вашем скрипте есть некоторые функции, которые не поддерживаются этой системой, вы должны объявить #/bin/bash. Я столкнулся с этой проблемой раньше, чем на работе, и теперь я просто включаю ее в качестве практики.