-- TOC --
env和printenv命令介绍。
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 - 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 --