我已经阅读了linux命令的env
手册,具体来说,对于-i
选项,手册上说:
-i,–ignore-environment#从一个空的环境开始
我得到的是,当指定-i
选项时,环境是空的,即没有环境variables,所以命令env -i ls
应该打印类似命令未find的东西,但我看到的是命令执行成功。 所以请解释一下,我误解了什么?
我认为最好是阅读源代码,找出操作系统路径变量是否通过清除环境 – 特雷西持续存在
阅读源代码当然会提供有关此事的所有信息。 但是我们也可以通过使用strace
来获得有价值的线索:
> strace -eexecve env -i ls execve(“/ usr / bin / env”,[“env”,“-i”,“ls”],[/ * 48 vars * /])= 0 execve(“ls”,[“ls”],[/ * 0 vars * /])= -1 ENOENT(没有这样的文件或目录) execve(“/ bin / ls”,[“ls”],[/ * 0 vars * /])= 0
我们看到env
尝试执行没有路径的"ls"
,然后尝试执行成功的"/bin/ls"
。 我们也看到它从一个空的环境开始 [/* 0 vars */]
。
> strace -eexecve env -i foo execve(“/ usr / bin / env”,[“env”,“-i”,“foo”],[/ * 48 vars * /])= 0 execve(“foo”,[“foo”],[/ * 0 vars * /])= -1 ENOENT(没有这样的文件或目录) execve(“/ bin / foo”,[“foo”],[/ * 0 vars * /])= -1 ENOENT(没有这样的文件或目录) execve(“/ usr / bin / foo”,[“foo”],[/ * 0 vars * /])= -1 ENOENT(没有这样的文件或目录) env:foo:没有这样的文件或目录
当指定不存在的命令或驻留在其他路径中的命令时,我们看到env
最后尝试了/usr/bin/
路径,就是这样。 所以,显然/bin/
和/usr/bin/
在env
是硬编码的,使用-i
命令的环境确实是空的。 另一个测试:
> env -i strace ls strace:ls:command not found
如果ls
不是由env -i
直接执行,而是通过另一个命令间接执行,则不会被找到。
环境是指在登录时在.bashrc和.bash_profile中设置的所有shell变量。 如果你正在编译的东西,你可以设置CFLAGS
变量。 如果你已经安装了一个奇怪的目录,你可以执行一个export PATH=$PATH:$HOME/build/bin
来允许它运行而不指定它的完整路径。
env -i
清除所有这些用户设置的变量,并为您提供一个空白的环境,例如,您可以测试一个命令是如何工作的,如果没有设置这些额外的变量。