为什么env -i与命令手册不匹配

我已经阅读了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清除所有这些用户设置的变量,并为您提供一个空白的环境,例如,您可以测试一个命令是如何工作的,如果没有设置这些额外的变量。