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