Есть ли какой-либо Bash
shebang объективно лучше других для большинства применений?
#!/usr/bin/env bash
#!/bin/bash
#!/bin/sh
#!/bin/sh -
Я смутно вспоминаю давным-давно о том, что добавление штриха в конец не позволяет кому-то передать команду вашему script, но не может найти никаких подробностей.
Вы должны использовать #!/usr/bin/env bash
для переносимости: разные * nixes put bash
в разных местах, а использование /usr/bin/env
- это обходной путь для запуска первого bash
найденного в PATH
. И sh
не bash
.
/bin/sh
и т. Д.).
#!/bin/bash
? Зависит ли это от того, определил ли пользователь правильный path
?
/bin/sh
обычно является ссылкой на стандартную оболочку системы, в которой многие или большинство мест будут /usr/bin/bash
. Однако исходная оболочка Bourne sh
, поэтому, если ваш script использует некоторые bash
(второе поколение, "Bourne Again sh" ), тогда вы должны быть более конкретными и использовать их позже. Таким образом, в системах, где bash не установлен, ваш script не будет запущен.
Я понимаю, что может быть захватывающая трилогия фильмов об этой эволюции... но это может случиться.
Использование строки shebang для вызова соответствующего интерпретатора относится не только к BASH. Вы можете использовать shebang для любого интерпретируемого языка в вашей системе, например Perl, Python, PHP (CLI) и многие другие. Кстати, shebang
#!/bin/sh -
(он также может быть двумя тире, т.е. --
) заканчивает bash параметры, после того как будут обработаны имена файлов и аргументы.
Использование команды env
делает ваш script переносной и позволяет настраивать настраиваемые среды для вашего script, поэтому переносимые скрипты должны использовать
#!/usr/bin/env bash
Или для любого языка, такого как Perl
#!/usr/bin/env perl
Обязательно просмотрите страницы man
для bash
:
man bash
и env
:
man env
Примечание. В системах на базе Debian и Debian, таких как Ubuntu, sh
связан с dash
not bash
. Как и все системные сценарии, используйте sh
. Это позволяет bash расти, и система остается стабильной, согласно Debian.
Кроме того, чтобы сохранить invocation * nix, как я никогда не использую расширения файлов для скриптов, выписанных shebang, так как вы не можете опустить расширение при вызове на исполняемые файлы, как вы можете в Windows. Команда файла может идентифицировать ее как script.
Это действительно зависит от того, как вы пишете сценарии bash. Если ваш /bin/sh
символически связан с bash, когда bash вызывается как sh
, некоторые функции недоступны.
Если вы хотите bash -специфические функции, отличные от POSIX, используйте #!/bin/bash
pkg_add
, то он находится в /usr/local/bin
, который может не находиться в пути.
/usr/local/bin/bash
на OpenBSD.