Раньше я делал сценарии Bash, и все они работали нормально без #!/bin/bash
в начале.
Какой смысл вставлять? Было бы все иначе?
Кроме того, как вы произносите #
? Я знаю, что !
произносится как «бах».
Как произносится #!
?
Раньше я делал сценарии Bash, и все они работали нормально без #!/bin/bash
в начале.
Какой смысл вставлять? Было бы все иначе?
Кроме того, как вы произносите #
? Я знаю, что !
произносится как «бах».
Как произносится #!
?
Это соглашение, поэтому оболочка * 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
.
execve(2)
syscall; так что shebang - это соглашение ядра, а не оболочки.
- person Basile Starynkevitch; 23.01.2012
#!/bin/sh
к таким вещам, как .profile
и тому подобное, которое запускает onload
- person Kellen Stuart; 18.10.2016
.profile
или .bashrc
исходят, а не выполняются, поэтому не хотите начинать с символа #!
- person Scott Stensland; 06.12.2019
#! /
. Обратите внимание на пробел между восклицательным знаком и косой чертой. В результате первые четыре байта сценария начинаются с одного и того же магического значения: магического значения сценария оболочки. Это значение используется (использовалось), например, такой утилитой, как file
, чтобы распознать, что это за файл. Конечно, в наши дни file и т. Д. Прекрасно распознают каждую оболочку, даже если большинство людей не учитывают пространство.
- person Carlo Wood; 13.05.2020
"#!" (23 21)
, "MZ" (4D 5A)
, "PK" (50 4B)
и т. Д. И т. Д.
- person paulsm4; 15.05.2020
Точнее, shebang #!
, когда это первые два байта исполняемый (x
режим) файл, интерпретируется системный вызов execve (2) (выполняющий программы). Но в спецификации POSIX для execve
не упоминается shebang.
За ним должен следовать путь к файлу исполняемого файла интерпретатора (который, кстати, может быть даже относительным, но чаще всего абсолютным).
Хороший трюк (или, возможно, не очень хороший), чтобы найти интерпретатор (например, python
) в $PATH
пользователя использовать программу env
(всегда /usr/bin/env
во всех Linux), например,
#!/usr/bin/env python
Любой исполняемый файл ELF может быть интерпретатором. Вы даже можете использовать #!/bin/cat
или #!/bin/true
, если хотите! (но это часто было бы бесполезно)
#!/usr/bin/env bash -x
. Как я могу это сделать ?
- person indianwebdevil; 15.05.2017
#!/usr/bin/env bash -x
- person indianwebdevil; 15.05.2017
bash
почти всегда на /bin/bash
, так что ваш шебанг должен быть #!/bin/bash -x
- person Basile Starynkevitch; 15.05.2017
Это называется shebang. На языке unix # называется резким (как в музыке) или хешем (как хэштеги в твиттере), и! называется челка. (На самом деле вы можете ссылаться на свою предыдущую команду оболочки с помощью !!, которая называется bang-bang). Итак, когда все вместе, вы получаете хаШ-БАНГ, или шебанг.
Часть после #! сообщает Unix, какую программу использовать для его запуска. Если он не указан, он попытается использовать bash (или sh, или zsh, или любую другую переменную $ SHELL), но если она есть, она будет использовать эту программу. Кроме того, # является комментарием на большинстве языков, поэтому строка игнорируется при последующем выполнении.
execve(2)
системный вызов не использует переменную $SHELL
. Это ядро интерпретирует шебанг.
- person Basile Starynkevitch; 23.01.2012
#!
работает даже для чего-то, запущенного из find -exec
(т.е. не напрямую из оболочки). например с echo hello
в /tmp/foo
(исполняемый файл), strace и ltrace -f find [file] -exec /tmp/foo {} +
показывает, что execvp(3)
успешно: сначала он пытается execve(2)
, что, конечно, терпит неудачу с ENOEXEC (Exec format error)
, но затем возвращается к execve
ing /bin/sh
/tmp/foo
. Итак, ваше утверждение, что Unix попробует $ SHELL, ближе к правильному, чем я предполагал, благодаря помощи libc. Большинство программ не используют execve
напрямую, но не- #! тогда сломается.
- person Peter Cordes; 20.06.2016
echo $SHELL
, и результат был /bin/bash
. Так что то, чего я раньше не знал. Спасибо.
- person mikelovelyuk; 27.08.2017
Операционная система использует оболочку по умолчанию для запуска вашего сценария оболочки. поэтому, упоминая путь к оболочке в начале скрипта, вы просите ОС использовать именно эту оболочку. Это также полезно для переносимости.
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
для выполнения команд, которые следуют в сценарии.
#!
часто называют «хэш-бэнг», «ша-бэнг» или «ша-бэнг».
Это называется шебанг. Он состоит из знака числа и восклицательного знака (#!), За которым следует полный путь к интерпретатору, например / 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. Я сталкивался с этой проблемой раньше на работе, и теперь я просто включаю ее в качестве практики.
./yourscript.extension
, например,./helloworld.py
или./helloworld.sh
, он будет искать интерпретатор в этой верхней строке, которая будет#!/bin/python
или!#/bin/bash
, тогда как при выполнении сценария, такого какpython helloworld.py
, первая строка не будет наблюдаться, потому что это закомментировано. Так что это особая последовательность для оболочки / ядра. - person Jacqlyn   schedule 19.06.2015