Зачем вам нужно ставить #!/ 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. Я столкнулся с этой проблемой раньше, чем на работе, и теперь я просто включаю ее в качестве практики.

Другие вопросы по тегам