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

774

Есть ли какой-либо Bash shebang объективно лучше других для большинства применений?

  • #!/usr/bin/env bash
  • #!/bin/bash
  • #!/bin/sh
  • #!/bin/sh -
  • и т.д.

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

  • 4
    И его /usr/local/bin/bash на OpenBSD.
Теги:
shebang

4 ответа

1101
Лучший ответ

Вы должны использовать #!/usr/bin/env bash для переносимости: разные * nixes put bash в разных местах, а использование /usr/bin/env - это обходной путь для запуска первого bash найденного в PATH. И sh не bash.

  • 8
    Благодарю. Также похоже на то, что добавление - в конец $! / Usr / bin / env bash - ничего не изменит, так как * nix в shebang разрешает только один аргумент, который используется 'bash'. Это, очевидно, полезно только для предотвращения передачи вредоносных аргументов в сценарий из командной строки, если шебанг сценария является одним из других без аргументов ( /bin/sh и т. Д.).
  • 5
    Почему не #!/bin/bash ? Зависит ли это от того, определил ли пользователь правильный path ?
Показать ещё 10 комментариев
59

/bin/sh обычно является ссылкой на стандартную оболочку системы, в которой многие или большинство мест будут /usr/bin/bash. Однако исходная оболочка Bourne sh, поэтому, если ваш script использует некоторые bash (второе поколение, "Bourne Again sh" ), тогда вы должны быть более конкретными и использовать их позже. Таким образом, в системах, где bash не установлен, ваш script не будет запущен.

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

  • 2
    Public Domain Korn Shell (pdksh) по умолчанию используется в OpenBSD.
  • 22
    «Я могу набрать полмили, прежде чем мои руки начнут дрожать».
Показать ещё 2 комментария
15

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

2

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

Если вы хотите bash -специфические функции, отличные от POSIX, используйте #!/bin/bash

  • 3
    Bash не установлен на OpenBSD. Если вы устанавливаете его через pkg_add , то он находится в /usr/local/bin , который может не находиться в пути.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню