为什么shebang`env <executable>`而不是`executable`,即使不需要预先设置环境变量?

时间:2017-06-08 18:13:36

标签: shell executable shebang

为什么建议使用/ usr / bin / env python而不是/ usr / bin / python。 这是从阅读这里的回复中获得灵感: What do I use on linux to make a python program executable

我认为两者都会做同样的事情,但提到两者的答案平均有2票,而不是88票,对于使用env的答案。人们似乎真的同意使用env,但不解释原因。 env是否帮助您找到任何名为“python”的可执行文件,而不仅仅是用户可以自定义的特定路径中的那个?

我真的很想知道使用env的各种优点和用例,而man env没有解释它。 man env仅表示您可以在运行之前使用env设置环境变量,NAME = VALUE,但我们在链接的示例中没有这样做。

我觉得社区显然建议使用环境,但我自己的研究并没有暗示某个原因,所以如果你有想法为什么这样做是好的或好的,请回答。

1 个答案:

答案 0 :(得分:1)

使用virtualenv可确保使用当前定义的PATH中的第一个Python解释器,以遵守任何用户覆盖(对于Python,包括/bin/bash s等)。

这对于MacOS这样的环境尤其重要,因为OS-vendor软件包经常是过时的(例如,/opt/local/bin/bash是3.2 - 从2006年开始的发布系列 - 而如果用户有MacPorts或自制软件,/usr/local/bin/bash#!/usr/bin/env bash可能是现代的4.x;因此, intFreefile = FreeFile Open ThisWorkbook.Path & "\temp567.txt" For Input As #intFreefile lngRecordsInEmail = 0 Do Until EOF(intFreefile) Line Input #intFreefile, strText If InStr(1, strText, strDelimiter) > 0 Then If InStrRev(1, strText, strDelimiter) = 1 Then ' if last character in line = deliminator then ' how do i get the text on 2 lines below? Else ws.Cells(lngRow, 1).Value = strText End If If blColourCell Then ws.Cells(lngRow, 1).Interior.ColorIndex = 35 End If strText2 = strText2 + 1 lngRow = lngRow + 1 lngTotalRecords = lngTotalRecords + 1 lngRecordsInEmail = lngRecordsInEmail + 1 End If Loop Close 将获得用户安装的任何更新的bash解释器的好处,无论是系统范围还是他们的主目录,只要该解释器的位置在运行时在其PATH中出现。)