Что означает строка «#!/bin/sh» в сценарии оболочки UNIX?
спросил
Изменено 2 года, 3 месяца назад
Просмотрено 245 тысяч раз
Я просматривал несколько руководств по сценариям оболочки и нашел следующий пример программы:
#!/bin/sh прозрачный эхо "ЗДРАВСТВУЙ, МИР"
Может ли кто-нибудь сказать мне, что означает комментарий #!/bin/sh
в начале?
- оболочка
- unix
- ш
- шебанг
4
Он называется shebang и сообщает родительской оболочке какой интерпретатор следует использовать для выполнения скрипта.
#!/bin/sh <--------- сценарий, совместимый с оболочкой Bourne #!/usr/bin/perl <-- perl-скрипт #!/usr/bin/php <--- php-скрипт #!/bin/false <------ ничего не делающий скрипт, потому что false в любом случае возвращается немедленно.
Большинство языков сценариев склонны интерпретировать строку, начинающуюся с #
, как комментарий , и будут игнорировать следующую !/usr/bin/независимо
часть, что в противном случае может вызвать синтаксическую ошибку в интерпретируемом языке.
2
Когда вы пытаетесь запустить программу в Unix (с установленным исполняемым битом), операционная система просматривает первые несколько байтов файла. Они образуют так называемое «магическое число», которое можно использовать для определения формата программы и способа ее выполнения.
#!
соответствует магическому числу 0x2321 (ищите его в таблице ascii). Когда система видит это магическое число, она знает, что имеет дело с текстовым скриптом и читает до следующего \n
(есть предел, но он ускользает от меня атм). Идентифицировав интерпретатор (первый аргумент после шебанга), он вызовет интерпретатор.
Другие файлы также имеют магические номера. Попробуйте посмотреть файл растрового изображения (.BMP) через минус
, и вы увидите, что первые два символа равны 9.0015 БМ . Это магическое число означает, что файл действительно является растровым изображением.
Если файл, в котором живет этот сценарий, является исполняемым, решетка ( #!
) сообщает операционной системе, какой интерпретатор использовать для запуска сценария. В данном случае это, например, /bin/sh
.
Для получения дополнительной информации об этом есть статья в Википедии.
Первая строка сообщает оболочке, что если вы запускаете сценарий напрямую (./run.sh; в отличие от /bin/sh run.sh), он должен использовать эту программу (в данном случае /bin/sh) для интерпретации это.
Вы также можете использовать его для передачи аргументов, обычно -e (выход при ошибке), или использовать другие программы (/bin/awk, /usr/bin/perl и т. д.).
#!/bin/sh
или #!/bin/bash
должен быть первой строкой скрипта, потому что если вы не используете его в первой строке, то система будет обрабатывать все команды в этом скрипте как разные команды. Если первая строка #!/bin/sh
, то все команды будут рассматриваться как один скрипт и будет показано, что этот файл выполняется в ps
, а не команды внутри файла.
./эхо.ш ps -ef |grep эхо стажер 3036 2717 0 16:24 pts/0 00:00:00 /bin/sh ./echo.sh root 3042 2912 0 16:24 pts/1 00:00:00 grep --color=auto echo2
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google
Зарегистрироваться через Facebook
Зарегистрируйтесь, используя электронную почту и пароль
Опубликовать как гость
Электронная почта
Требуется, но не отображается
Опубликовать как гость
Электронная почта
Требуется, но не отображается
linux — Зачем вам нужно помещать #!/bin/bash в начало файла скрипта?
спросил
Изменено 2 года, 1 месяц назад
Просмотрено 790 тысяч раз
Раньше я делал сценарии Bash, и все они работали без #!/bin/bash
в начале.
Какой смысл его вставлять? Все было бы по-другому?
Кроме того, как произносится #
? Я знаю, что !
произносится как «взрыв».
Как #!
произносится?
- linux
- bash
- сценарии
- shebang
7
Это соглашение, поэтому оболочка *nix знает, какой интерпретатор запускать.
Например, старые версии ATT по умолчанию имеют значение 9.0153 sh (оболочка Bourne), в то время как более старые версии BSD по умолчанию использовали csh (оболочка C).
Даже сегодня (где большинство систем работает с bash, «Bourne Again Shell» ) сценарии могут быть на bash, python, perl, ruby, PHP и т. д., и т. д. Например, вы можете увидеть #!/bin /perl
или #!/bin/perl5
.
PS:
Восклицательный знак (!
) ласково называют «бах» . Символ комментария оболочки ( #
) иногда называют 9. 0153 «хэш» .
PPS:
Помните: в *nix связывание суффикса с типом файла является просто соглашением , а не «правилом» . Исполняемый файл может быть двоичной программой, любым из миллиона типов сценариев и другими вещами. Отсюда и необходимость #!/bin/bash
.
13
Точнее шебанг #!
, когда это первые два байта исполняемого файла x
), интерпретируется системным вызовом execve(2) (который запускает программы). Но спецификация POSIX для execve
не упоминает шебанг.
За ним должен следовать путь к исполняемому файлу интерпретатора (который, кстати, может быть даже относительным, но чаще всего абсолютным).
Хороший трюк (или, возможно, не очень хороший) для поиска интерпретатора (например, python
) в пользовательской $PATH
заключается в использовании программы env
(всегда в /usr/bin/env
во всех Linux), например,
#!/usr/bin/env Python
Любой исполняемый файл ELF может быть интерпретатором. Вы даже можете использовать #!/bin/cat
или #!/bin/true
, если хотите! (но часто это бесполезно)
4
Это называется шебанг. На Unix-языке # называется острым (как в музыке) или решеткой (как хэштеги в твиттере), а ! называется бах. (На самом деле вы можете сослаться на свою предыдущую команду оболочки с помощью !!, называемой bang-bang). Таким образом, если собрать их вместе, получится haSH-BANG или shebang.
Часть после #! сообщает Unix, какую программу использовать для его запуска. Если он не указан, он попытается использовать bash (или sh, или zsh, или любую другую вашу переменную $SHELL), но если он там есть, он будет использовать эту программу. Кроме того, в большинстве языков # является комментарием, поэтому при последующем выполнении эта строка игнорируется.
7
Каждый дистрибутив имеет оболочку по умолчанию. Bash используется по умолчанию в большинстве систем. Если вам случится работать в системе с другой оболочкой по умолчанию, сценарии могут работать не так, как предполагалось, если они написаны специально для Bash.
Bash развивался с годами, взяв код из ksh
и sh
.
Добавление #!/bin/bash
в качестве первой строки сценария указывает операционной системе, что нужно вызвать указанную оболочку
для выполнения команд, следующих в сценарии.
#!
часто называют «хэш-бэнг», «ше-бэнг» или «ша-бэнг».
Шебанг указывает загрузчику использовать программу, указанную после #!
в качестве интерпретатора рассматриваемого файла, когда вы пытаетесь его выполнить. Итак, если вы попытаетесь запустить файл с именем foo.sh
с #!/bin/bash
наверху, фактическая выполняемая команда — /bin/bash foo.sh
. Это гибкий способ использования разных интерпретаторов для разных программ.
Также стоит знать, что шебанг — это магическое число, удобочитаемое для человека, которое идентифицирует файл как сценарий для данного интерпретатора.
Вы говорите, что программа «работает» даже без шебанга только потому, что рассматриваемая программа представляет собой сценарий оболочки, написанный для той же оболочки, что и та, которую вы используете. Например, вы вполне можете написать файл javascript, а затем поставить #! /usr/bin/js
(или что-то подобное), чтобы иметь javascript «скрипт оболочки».
Операционная система использует оболочку по умолчанию для запуска сценария оболочки. поэтому, упомянув путь к оболочке в начале скрипта, вы просите ОС использовать эту конкретную оболочку. Это также полезно для портативности.
Это называется шебанг
Стандарты Bash для «Bourne-Again shell» — это лишь один тип из многих доступных оболочки в линуксе.
Оболочка — это интерпретатор командной строки, который принимает и выполняет команды.
Bash часто является оболочкой по умолчанию в большинстве дистрибутивов Linux. Вот почему Баш синоним оболочки.
Сценарии оболочки часто имеют почти одинаковый синтаксис, но иногда они также различаются. Например, индекс массива начинается с 1 в Zsh вместо 0 в bash. Скрипт написанный для оболочки Zsh, не будет работать так же в bash, если в нем есть массивы.
Во избежание неприятных сюрпризов следует сообщить интерпретатору, что ваш сценарий оболочки написан для оболочки bash. Как ты это делаешь?
просто запустите скрипт bash в #!/bin/bash
Также вы увидите некоторые другие параметры после #!/bin/bash,
например
#!/bin/bash -v -x
прочитайте это, чтобы получить больше информации.