Вопрос по bash – Какой предпочтительный Баш Шебанг?

904

Есть лиBash объективно ли лучше, чем другие?

#!/usr/bin/env bash #!/bin/bash #!/bin/sh #!/bin/sh - etc

Я смутно помню, как давным-давно слышал, что добавление тире в конец не позволяет кому-либо передать команду в ваш сценарий, но не может найти никаких подробностей по этому поводу.

И его/usr/local/bin/bash на OpenBSD. jww

Ваш Ответ

5   ответов
1231

#!/usr/bin/env bash запортативность: разные * ники ставятbash в разных местах, и используя/usr/bin/env это обходной путь, чтобы запустить первыйbash найден наPATH, А такжеsh is not bash.

Error: User Rate Limit ExceededenvError: User Rate Limit Exceeded/usr/bin/envError: User Rate Limit Exceeded/bin/envError: User Rate Limit Exceeded/dummy/envError: User Rate Limit Exceeded/dummyError: User Rate Limit ExceededPATHError: User Rate Limit Exceeded#!stop toasterError: User Rate Limit Exceeded#!/usr/bin/env bashError: User Rate Limit Exceeded#!/bin/bashError: User Rate Limit Exceeded
Error: User Rate Limit ExceededbashError: User Rate Limit Exceeded/binError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded#!/bin/bashError: User Rate Limit ExceededpathError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded/bin/shError: User Rate Limit Exceeded Kurtosis
Error: User Rate Limit Exceededalias shebang='echo "#!/usr/bin/env bash"'Error: User Rate Limit Exceeded
7

Я рекомендую использовать:

#!/bin/bash

Он не на 100% переносим (в некоторых системахbash в месте, отличном от/bin), но факт, что многие существующие скрипты используют#!/bin/bash давление на различные операционные системы, чтобы сделать/bin/bash по крайней мере, символическая ссылка на основное местоположение.

Альтернатива:

#!/usr/bin/env bash

было предложено, но нет никакой гарантии, чтоenv команда находится в/usr/bin (и я использовал системы там, где это не так). Кроме того, эта форма будет использовать первый экземплярbash в текущих пользователях$PATH, который не может быть подходящей версией оболочки bash.

Если вам нужен скрипт для запуска в системе, в которой нет/bin/bashВы можете изменить сценарий так, чтобы он указывал на правильное местоположение (что, по общему признанию, неудобно).

Я обсуждал компромиссы более подробно вмой ответ вэтот вопрос.

3

как вы пишете свои bash-скрипты. Если твой/bin/sh символическая ссылка на bash, когда bash вызывается какsh, некоторые функции недоступны.

Если вам нужны специфичные для bash функции, не относящиеся к POSIX, используйте#!/bin/bash

Error: User Rate Limit Exceededpkg_addError: User Rate Limit Exceeded/usr/local/binError: User Rate Limit Exceeded
17

а не только для BASH. Вы можете использовать shebang для любого интерпретируемого языка в вашей системе, такого как Perl, Python, PHP (CLI) и многих других. Кстати, Шебанг

#!/bin/sh -

(это также может быть две черты, т.е.--) завершает все параметры bash после того, как будет рассматриваться как имена файлов и аргументы.

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

68

/bin/sh обычно является ссылкой на системную оболочку по умолчанию, которая частоbash но, например, системы Debian легчеdash, В любом случае, оригинальная оболочка Bournesh, так что если ваш сценарий использует некоторыеbash (2-е поколение, «Bourne Again sh») специфические особенности ([[ ]] тесты, массивы, различные сладкие вещи и т. д.), тогда вы должны быть более конкретными и использовать позже. Таким образом, в системах, где bash не установлен, ваш скрипт не запустится. Я понимаю, что может быть захватывающая трилогия фильмов об этой эволюции ... но это может быть слухом.

Также обратите внимание, что когда вызывается какsh, bash до некоторой степениведет себя как стандарт POSIX sh (смотрите такжедокументы GNU об этом).

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded/binError: User Rate Limit Exceeded/sbinError: User Rate Limit Exceeded/usr/binError: User Rate Limit Exceeded/usr/sbinError: User Rate Limit Exceeded/bin/shError: User Rate Limit ExceededbashError: User Rate Limit Exceeded/usr/binError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceedednotError: User Rate Limit Exceeded/bin/shError: User Rate Limit Exceeded/usrError: User Rate Limit Exceeded/usrError: User Rate Limit Exceeded

Похожие вопросы