В чем разница между «#! / Usr / bin / env bash» и «#! / Usr / bin / bash»?

178

В заголовке bash script, какая разница между этими двумя утверждениями?

  • #!/usr/bin/env bash

  • #!/usr/bin/bash

Когда я попытался увидеть man-страницу env, я просто получаю это определение:

 env - run a program in a modified environment

Что это значит?

  • 7
    Смотрите этот вопрос и мой ответ .
  • 2
    Именно тот ответ, который мне нужен, спасибо @KeithThompson.
Показать ещё 7 комментариев
Теги:
shebang

4 ответа

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

Запуск команды через /usr/bin/env имеет преимущество поиска любой версии программы по умолчанию в текущем глазе env.

Таким образом, вам не нужно искать его в определенном месте в системе, поскольку эти пути могут находиться в разных местах в разных системах. Пока он на вашем пути, он найдет его.

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

#!/usr/bin/env bash #lends you some flexibility on different systems
#!/usr/bin/bash     #gives you explicit control on a given system of what executable is called

В некоторых ситуациях первое может быть предпочтительным (например, запуск сценариев python с несколькими версиями python без необходимости перерабатывать исполняемую строку). Но в ситуациях, когда безопасность является фокусом, последнее предпочтительнее, поскольку это ограничивает возможности инъекции кода.

  • 19
    Другим недостатком является то, что вы не можете передать дополнительный аргумент интерпретатору.
  • 1
    @KeithThompson: Неверная информация. Вы можете передать параметры соответствующему интерпретатору, используя / usr / bin / env!
Показать ещё 8 комментариев
21

Использование #!/usr/bin/env NAME заставляет оболочку искать первое соответствие NAME в переменной среды $PATH. Это может быть полезно, если вы не знаете об абсолютном пути или не хотите его искать.

  • 7
    По крайней мере, вы должны знать, где находится env :).
  • 0
    Отличный ответ. Кратко объясняет, что делает env shebang, вместо того, чтобы сказать «выбирает программу на основе конфигурации вашей системы»
3

Вместо явного определения пути к интерпретатору, как в /usr/bin/bash/, с помощью команды env, интерпретатор выполняется поиск и запускается из любого места, где он был впервые найден. У этого есть верхние и нижние стороны

  • 0
    На большинстве систем они будут одинаковыми, но это зависит от расположения исполняемых файлов bash и env. Не уверен, как это повлияет на переменные среды, хотя.
  • 1
    «Можно указать переводчика без использования env, указав полный путь к интерпретатору. Проблема заключается в том, что в разных компьютерных системах точный путь может быть разным. Вместо этого при использовании env ищется переводчик, который находится в время выполнения сценария. Это делает сценарий более переносимым, но также увеличивает риск выбора неправильного интерпретатора, поскольку он ищет совпадения в каждом каталоге на исполняемом пути поиска. Он также страдает от той же проблемы, что путь к двоичному файлу env также может быть разным для каждого компьютера. "- Википедия
0

Я считаю это полезным, потому что, когда я не знал об env, прежде чем начал писать script, я делал это:

type nodejs > scriptname.js #or any other environment

а затем я изменял эту строку в файле в shebang.
Я делал это, потому что я не всегда помнил, где nodejs на моем компьютере -/usr/bin/или/bin/, поэтому для меня env очень полезно. Возможно, есть подробности с этим, но это моя причина.

Ещё вопросы

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