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

时间:2016-08-03 14:04:29

标签: linux shell environment-variables env

我已经阅读了linux命令env手册,具体来说,对于-i选项,手册说:

  

-i, - ignore-environment#以空白环境开始

我得到的是,当指定-i选项时,环境为空,即没有环境变量,因此命令env -i ls应该打印命令未找到< / strong>,但我看到的是命令执行成功。所以请解释一下,我是否误解了什么?

2 个答案:

答案 0 :(得分:1)

  

我认为最好阅读源代码以了解操作系统   PATH变量通过清除环境持续存在 - Tracy

阅读源代码当然会提供有关此事的所有信息。但我们也可以使用strace

获取有价值的线索
>strace -eexecve env -i ls       
execve("/usr/bin/env", ["env", "-i", "ls"], [/* 48 vars */]) = 0
execve("ls", ["ls"], [/* 0 vars */])    = -1 ENOENT (No such file or directory)
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 (No such file or directory)
execve("/bin/foo", ["foo"], [/* 0 vars */]) = -1 ENOENT (No such file or directory)
execve("/usr/bin/foo", ["foo"], [/* 0 vars */]) = -1 ENOENT (No such file or directory)
env: foo: No such file or directory

当指定不存在的命令或驻留在某个其他路径中的命令时,我们看到env最终尝试/usr/bin/路径,就是这样。因此,显然/bin//usr/bin/env中是硬编码的,而-i命令的环境确实是空的。另一个测试:

>env -i strace ls
strace: ls: command not found

如果ls不是由env -i直接执行,而是通过另一个命令间接执行,则找不到它。

答案 1 :(得分:0)

环境是指您在登录时在.bashrc和.bash_profile中设置的所有shell变量。如果您正在编译某些内容,则可以设置CFLAGS变量。如果您在奇怪的目录中安装了某些内容,则可以执行export PATH=$PATH:$HOME/build/bin以允许它运行而不指定其完整路径。

env -i清除所有这些用户设置变量,并为您提供一个空白环境,因此,如果您没有设置这些额外变量,您可以测试命令的工作方式。