Есть ли какой-нибудь Bash
объективный лучше Шебанга, чем другие, для большинства применений?
#!/usr/bin/env bash
#!/bin/bash
#!/bin/sh
#!/bin/sh -
- так далее
Я смутно помню, как давным-давно слышал, что добавление тире в конец не позволяет кому-то передать команду вашему сценарию, но не может найти никаких подробностей по этому поводу.
/usr/local/bin/bash
на OpenBSD.Ответы:
Вы должны использовать
#!/usr/bin/env bash
для переносимости : разные * nixes помещаютсяbash
в разные места, и использование/usr/bin/env
- это обходной путь для запуска первогоbash
найденного наPATH
. Иsh
нетbash
.источник
/bin/sh
и т. Д.).bash
живет не во/bin
всех системах.alias shebang='echo "#!/usr/bin/env bash"'
теперь мне просто нужно открыть терминал и набрать shebang вместо того, чтобы идти сюда.env
на/usr/bin/env
. Это может быть на/bin/env
самом деле или в любом месте, если оно находится на пути. Это может быть в/dummy/env
случае если/dummy
вPATH
. Сам по себе Шебанг не определен в POSIX, поэтому я мог бы#!stop toaster
запустить кофемашину USB и быть POSIX-совместимым. Так#!/usr/bin/env bash
что не лучше, чем#!/bin/bash
, он может быть менее портативным в зависимости./usr/bin/env
существует на большем количестве машин, чем на/bin/bash
xor/usr/bin/bash
, поэтому сценарий, начинающийся с этой строки, будет выполнять ожидаемое действие на как можно/bin/sh
обычно это ссылка на системную оболочку по умолчанию, которая часто,bash
но, например, на системах Debian, имеет меньший весdash
. В любом случае, оригинальная оболочка Bourne таковаsh
, поэтому, если ваш сценарий использует некоторыеbash
(2-го поколения, «Bourne Again sh») специфические функции ([[ ]]
тесты, массивы, различные сладкие вещи и т. Д.), То вам следует быть более конкретным и использовать более позднюю версию. , Таким образом, в системах, где bash не установлен, ваш скрипт не будет работать. Я понимаю, что может быть захватывающая трилогия фильмов об этой эволюции ... но это может быть слухом.Также обратите внимание, что когда вызывается как
sh
,bash
в некоторой степени ведет себя как стандарт POSIXsh
(см. Также документацию GNU об этом).источник
/bin/sh
нигде, так/usr
как это может затруднить запуск сценариев инициализации до/usr
монтирования./bin
и в/sbin
течение многих лет просто символические ссылки по умолчанию,/usr/bin
и/usr/sbin
, так что в этом контексте/bin/sh
ссылка наbash
и фактические каталог есть/usr/bin
. Но я исправлю вышеизложенное.Я рекомендую использовать:
Он не на 100% переносим (некоторые системы размещаются
bash
в другом месте, кроме/bin
), но тот факт, что во многих существующих сценариях используются#!/bin/bash
различные операционные системы, заставляет/bin/bash
по крайней мере создать символическую ссылку на основное местоположение.Альтернатива:
было предложено - но нет никакой гарантии, что
env
команда находится в/usr/bin
(и я использовал системы, где это не так). Кроме того, эта форма будет использовать первый экземплярbash
текущего пользователя$PATH
, который может не подходить для оболочки bash.(Но он
/usr/bin/env
должен работать на любой достаточно современной системе, либо потому, что онаenv
есть,/usr/bin
либо потому, что система делает что-то, чтобы заставить ее работать. Система, о которой я говорил выше, была SunOS 4, которую я, вероятно, не использовал около 25 лет.)Если вам нужен сценарий для запуска в системе, в которой его нет
/bin/bash
, вы можете изменить сценарий так, чтобы он указывал на правильное местоположение (что, по общему признанию, неудобно).Я обсудил компромиссы более подробно в своем ответе на этот вопрос .
Несколько неясное обновление: одна система, которую я использую, Termux , слой , похожий на Linux для настольных компьютеров и работающий под Android, не имеет
/bin/bash
(bash
есть/data/data/com.termux/files/usr/bin/bash
), но имеет специальную поддержку для поддержки#!/bin/bash
.источник
Использование строки shebang для вызова соответствующего интерпретатора не только для BASH. Вы можете использовать shebang для любого интерпретируемого языка в вашей системе, такого как Perl, Python, PHP (CLI) и многих других. Кстати, Шебанг
(это также может быть две черты, т. е.
--
) заканчивает опции bash, все после того, как будут рассматриваться как имена файлов и аргументы.Использование
env
команды делает ваш сценарий переносимым и позволяет настраивать пользовательские среды для вашего сценария, следовательно, переносимые сценарии должны использоватьИли для любого языка, например, для Perl
Обязательно посмотрите на
man
страницы дляbash
:и
env
:Примечание. В системах Debian и Debian, таких как Ubuntu,
sh
это связано сdash
notbash
. Как все системные скрипты используютsh
. Это позволяет bash расти и система остается стабильной, согласно Debian.Кроме того, чтобы сохранить вызов * nix, я никогда не использую расширения файлов в сценариях, вызываемых shebang, так как вы не можете опустить расширение при вызове исполняемых файлов, как в Windows. Команда file может идентифицировать его как скрипт.
источник
Это действительно зависит от того, как вы пишете свои bash-скрипты. Если ваша
/bin/sh
ссылка на bash, когда bash вызывается какsh
, некоторые функции недоступны .Если вам нужны специфичные для bash функции, не относящиеся к POSIX, используйте
#!/bin/bash
источник
pkg_add
, то он находится в/usr/local/bin
, который может не быть в пути.POSIX
функции?