Linux 中的 env 是什么

env 是环境 Environment 的缩写,正如它的名字一样,它用于 显示系统中已存在的环境变量 ,以及 在定义的环境中执行指令,一般位于/usr/bin/env

env 作为脚本解释器指定程序

用 env 启动是因为脚本解释器在 linux 可能被安装于不同目录,所以要在 PATH 环境变量中找

$ /usr/bin/env
...
SHELL=/bin/zsh
...
PATH=/Users/maywzh/.pyenv/shims:/Users/maywzh/.pyenv/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Applications/Wireshark.app/Contents/MacOS

以 python 为例

在这里我们使用了 pyenv 来管理多版本 python,它的具体可见https://github.com/pyenv/pyenv

它可以选用特定环境使用的 python 版本,把 ~/.pyenv/shims 作为一个垫片路径,里面是选定的 python 版本的解释器。

$ ls /Users/maywzh/.pyenv/shims
2to3              easy_install      idle              idle3.7           pip3              pydoc             pydoc3.7          python-config     python3-config    python3.7-config  python3.7m-config pyvenv-3.7
2to3-3.7          easy_install-3.7  idle3             pip               pip3.7            pydoc3            python            python3           python3.7         python3.7m        pyvenv

在这里选用了 python3.7,可以直接用下面命令来确定使用的版本

$ env python
Python 3.7.1 (default, Oct 22 2018, 04:20:43)
[Clang 10.0.0 (clang-1000.10.44.2)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>

用这种方式使用 python 就相当灵活,只需要配置 PATH 变量即可,不会出现因为写死解释器路径而找不到解释器的情况。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

'''hello.py'''

print("hello")

要运行该程序

$ chmod +x hello.py # 为该脚本程序添加执行权限
$ ./hello.py # 因为指定了 #!/usr/bin/env python , 调用 python 解释器来运行该脚本程序
hello