Какой рекомендуется использовать shebang ("#!") для Bash?
Какой shebang для Bash
является объективно лучшим для большинства случаев использования?
Я рассматриваю следующие варианты:
#!/usr/bin/env bash
#!/bin/bash
#!/bin/sh
#!/bin/sh -
- и другие
Я смутно помню, что давно слышал, что добавление дефиса в конце предотвращает передачу аргументов в ваш скрипт, но не могу найти никаких деталей по этому вопросу.
Какой из вариантов лучше использовать и почему? Есть ли какие-то рекомендации или соображения по этому поводу?
3 ответ(ов)
В большинстве случаев скрипты не требуют специфичных возможностей bash и должны быть написаны для sh
. Это также обеспечивает работоспособность скриптов на BSD-системах, где bash по умолчанию не установлен.
Использование строки shebang для вызова соответствующего интерпретатора — это не только для BASH. Вы можете использовать shebang для любого интерпретируемого языка на вашей системе, например, Perl, Python, PHP (CLI) и многих других. Кстати, shebang
#!/bin/sh -
(можно также использовать две черточки, т.е. --
) завершает опции bash, и всё, что следует после, будет treated как имена файлов и аргументы.
Использование команды env
делает ваш скрипт портативным и позволяет настраивать пользовательские окружения для вашего скрипта, поэтому портативные скрипты должны использовать
#!/usr/bin/env bash
Или для любого другого языка, например, для Perl
#!/usr/bin/env perl
Не забудьте ознакомиться со страницами man
для bash
:
man bash
и env
:
man env
Замечание: На системах Debian и основанных на Debian, таких как Ubuntu, sh
ссылается на dash
, а не на bash
. Поскольку все системные скрипты используют sh
, это позволяет bash развиваться, а системе оставаться стабильной, согласно Debian.
Кроме того, чтобы сохранить вызов в стиле *nix, я никогда не использую расширения файлов для скриптов, вызываемых с помощью shebang, так как вы не можете опустить расширение при вызове исполняемых файлов, как это возможно на Windows. Команда file может определить его как скрипт.
Если вы хотите, чтобы ваш скрипт был портативным и работал на Alpine Linux, где по умолчанию нет установленного bash, используйте #!/bin/sh
и не указывайте bash явно. Старайтесь писать скрипты, совместимые с POSIX, вместо того чтобы полагаться на расширения bash. Места, где сейчас запускается Alpine Linux, значительно превышают редкие и странные системы, где #!/bin/sh
не работает.
На Ubuntu и Alpine ваш скрипт будет выполняться с использованием какой-то версии ash. Это также означает, что вы будете меньше подвержены уязвимостям безопасности, связанным с bash, таким как shellshock, в отличие от работы на bash. Bash широко используется, но его внутренняя реализация оставляет желать лучшего, поэтому явное указание bash в качестве используемого интерпретатора вместо полагания на выбор системного интерпретатора считается плохой практикой.
Извлечение имени файла и расширения в Bash
Как изменить цвет вывода echo в Linux
Как сделать паузу в shell-скрипте на одну секунду перед продолжением?
Как работает "cat << EOF" в bash?
Почему в первой строке Python-скрипта пишут "#!/usr/bin/env python"?