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

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

  1. #!/usr/bin/env bash

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