В заголовке bash
script, какая разница между этими двумя утверждениями?
#!/usr/bin/env bash
#!/usr/bin/bash
Когда я попытался увидеть man-страницу env
, я просто получаю это определение:
env - run a program in a modified environment
Что это значит?
Запуск команды через /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 без необходимости перерабатывать исполняемую строку). Но в ситуациях, когда безопасность является фокусом, последнее предпочтительнее, поскольку это ограничивает возможности инъекции кода.
Использование #!/usr/bin/env NAME
заставляет оболочку искать первое соответствие NAME в переменной среды $PATH. Это может быть полезно, если вы не знаете об абсолютном пути или не хотите его искать.
Вместо явного определения пути к интерпретатору, как в /usr/bin/bash/
, с помощью команды env, интерпретатор выполняется поиск и запускается из любого места, где он был впервые найден. У этого есть верхние и нижние стороны
Я считаю это полезным, потому что, когда я не знал об env, прежде чем начал писать script, я делал это:
type nodejs > scriptname.js #or any other environment
а затем я изменял эту строку в файле в shebang.
Я делал это, потому что я не всегда помнил, где nodejs на моем компьютере -/usr/bin/или/bin/, поэтому для меня env
очень полезно. Возможно, есть подробности с этим, но это моя причина.