env和printenv命令

-- TOC --

env和printenv命令介绍。

env命令

env取自environment,顾名思义,让命令在一个修改环境变量后的环境下执行。因为这个命令涉及到shell环境变量的一些机制,我在理解的时候,也确实走了一些弯路。

env - run a program in a modified environment. Set each NAME to VALUE in the environment and run COMMAND.

直接执行env命令,可以打印出所有环境变量,但是,这里的变量不是当前进程的变量,而是子进程继承的变量,所谓修改变量后执行命令,修改的也是子进程的变量。父进程有export的变量,才能够被子进程继承。

常常见到使用env的场景是在可执行脚本的第一行(#!行),比如:

#!/usr/bin/env python3
# ...

这表示通过环境变量$PATH来查找python3并执行此脚本,如果写成这样,#!/usr/bin/python3,表示直接使用这个绝对路径下的python3,有可能你的python3没有安装在这个位置!!

另一个用法是,比如系统中安装了两个不同的python版本,但是按照$PATH路径,永远只会找到第一个。如果希望执行另一个python,就可以使用env命令:

$ env PATH=/path/to/another/python python3

做个测试:

$ python3 -q
>>> exit()
$ env PATH='' python3 -q
env: ‘python3’: No such file or directory

当把PATH修改为空后,就找不到python3了!

其实,我的测试结果是,env的作用相当于export一个变量到子进程,而且貌似完全可以把env这个命令省掉(除了#!/usr/bin/env python3这种用法),具体请参考export命令

printenv命令

printenv - print all or part of environment

超简单的命令,输出所有(执行printenv的子进程的)环境变量,只有一个参数需要关注一下,-0参数!

$ printenv
...
$ printenv PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

本文链接:https://cs.pynote.net/sf/linux/shell/202110286/

-- EOF --

-- MORE --