1.15 /usr/bin/env python 有什么用?¶

我们经常会在别人的脚本或者项目的入口文件里看到第一行是下面这样
#!/usr/bin/python
或者这样
#!/usr/bin/env python
这两者有什么区别呢?
稍微接触过 linux 的人都知道 /usr/bin/python
就是我们执行 python
进入console 模式里的 python

而当你在可执行文件头里使用 #!
+ /usr/bin/python
,意思就是说你得用哪个软件 (python)来执行这个文件。
那么加和不加有什么区别呢?
不加的话,你每次执行这个脚本时,都得这样: python xx.py
,

有没有一种方式?可以省去每次都加 python
呢?
当然有,你可以文件头里加上#!/usr/bin/python
,那么当这个文件有可执行权限 时,只直接写这个脚本文件,就像下面这样。

明白了这个后,再来看看 !/usr/bin/env python
这个 又是什么意思 ?
当我执行 env python
时,自动进入了 python console 的模式。

这是为什么?和 直接执行 python 好像没什么区别呀
当你执行 env python
时,它其实会去 env | grep PATH
里(也就是
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
)这几个路径里去依次查找名为python的可执行文件。
找到一个就直接执行,上面我们的 python 路径是在 /usr/bin/python
里,在 PATH
列表里倒数第二个目录下,所以当我在 /usr/local/sbin
下创建一个名字也为 python 的可执行文件时,就会执行
/usr/local/sbin/python
了。
具体演示过程,你可以看下面。

那么对于这两者,我们应该使用哪个呢?
个人感觉应该优先使用 #!/usr/bin/env python
,因为不是所有的机器的
python 解释器都是 /usr/bin/python
。