16

Какой рекомендуется использовать shebang ("#!") для Bash?

16

Какой shebang для Bash является объективно лучшим для большинства случаев использования?

Я рассматриваю следующие варианты:

  • #!/usr/bin/env bash
  • #!/bin/bash
  • #!/bin/sh
  • #!/bin/sh -
  • и другие

Я смутно помню, что давно слышал, что добавление дефиса в конце предотвращает передачу аргументов в ваш скрипт, но не могу найти никаких деталей по этому вопросу.

Какой из вариантов лучше использовать и почему? Есть ли какие-то рекомендации или соображения по этому поводу?

3 ответ(ов)

0

В большинстве случаев скрипты не требуют специфичных возможностей bash и должны быть написаны для sh. Это также обеспечивает работоспособность скриптов на BSD-системах, где bash по умолчанию не установлен.

0

Использование строки 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 может определить его как скрипт.

0

Если вы хотите, чтобы ваш скрипт был портативным и работал на Alpine Linux, где по умолчанию нет установленного bash, используйте #!/bin/sh и не указывайте bash явно. Старайтесь писать скрипты, совместимые с POSIX, вместо того чтобы полагаться на расширения bash. Места, где сейчас запускается Alpine Linux, значительно превышают редкие и странные системы, где #!/bin/sh не работает.

На Ubuntu и Alpine ваш скрипт будет выполняться с использованием какой-то версии ash. Это также означает, что вы будете меньше подвержены уязвимостям безопасности, связанным с bash, таким как shellshock, в отличие от работы на bash. Bash широко используется, но его внутренняя реализация оставляет желать лучшего, поэтому явное указание bash в качестве используемого интерпретатора вместо полагания на выбор системного интерпретатора считается плохой практикой.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь