Использовать не зависящий от системы bash shebang (вместо #! / Bin / bash), который работает везде? - PullRequest
0 голосов
/ 29 декабря 2018

Обычно я ставлю шебанг для bash наверху моих сценариев оболочки, например:

#!/usr/bin/bash

Однако я вижу много других вариантов этого, таких как #!/bin/bash или #!/usr/local/bin/bash и т. Д.

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

Если интерпретатор оболочки, такой как bash, по-видимому, не всегда находится в одном и том же месте, не правда ли, НЕ ПРАВИЛЬНО использовать жестко закодированный путь в скрипте?

Я понял, что вы можете использовать несколькоболее гибкий или менее системно-зависимый подход, подобный этому:

#!/usr/bin/env bash

Что приводит к (или?) локальной версии bash, где бы она ни была установлена.

Последний вариант всегда работает?Или есть лучший подход, который имеет наибольшую вероятность ссылки на любой системный bash, независимо от того, где он установлен?

1 Ответ

0 голосов
/ 30 декабря 2018

Я бы порекомендовал либо "#! / Bin / bash", либо "#! / Usr / bin / bash".В современном дистрибутиве Linux bash должен быть установлен в обоих местах.

Очевидно, что это не так для OpenBSD ... который использует ksh в качестве оболочки по умолчанию.Но в системе OpenBSD вы обнаружите, что bash вообще не установлен.Это, по-видимому, необязательный пакет, и администратор, возможно, не установил его.

Итак, если вы хотите максимизировать переносимость , используйте "/ bin / sh" и ограничьтесь стандартным синтаксисом и командами оболочки POSIX.«/ bin / sh» обычно является ссылкой на bash или ksh и работает в режиме, совместимом с POSIX.


Другие варианты:

  • «#! / usr / local / bin / bash» обычно не работает в Linux.Если это так, он может дать вам локально построенную / модифицированную версию bash.

  • "#! / Usr / bin / env bash" должна работать с несколькими оговорками:

    1. Это даст вам любую версию bash, которая будет первой в пути поиска команд пользователя (т.е. $PATH).

    2. Возможно, что путь к env может быть другим или что он может не существовать.(Команда env не входила в первую версию спецификации POSIX.)

...