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


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

  1. #!/usr/bin/env bash

  2. #!/usr/bin/bash

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

 env - run a program in a modified environment

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

4 238

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 очень полезно. Может быть, есть детали с этим, но это моя причина