2016-08-03 40 views
2

我看了linux命令env手册,具体而言,对于-i选项,手册上说:为什么ENV -i不匹配的命令手动

-i,--ignore环境#开始一个空的环境

我得到的是,当指定-i选项时,环境是空的,即没有环境变量是存在的,所以命令env -i ls应打印像没有发现命令,但我看到的是命令执行成功。所以请解释一下,我误解了什么?

回答

0

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

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

+0

根据你的回答,'env -i'应该清除所有这些用户设置变量,包括'PATH' varibale,所以shell不应该找到'ls'的位置,但结果与我的不匹配思绪之中。 – Tracy

+0

将*用户添加*包含到PATH变量中。基本OS PATH变量(我认为你在/ etc/skel中设置的所有内容)通过清除环境持续存在,因此/ bin,/ usr/bin和/ usr/local/bin等内容将会保留。 – ijustlovemath

+1

我认为最好是阅读源代码以查明OS PATH变量是否通过清除环境持续存在 – Tracy

1

我觉得更好的阅读源代码,找出OS PATH变量是否仍然存在通过环境的结算特雷西 -

阅读源代码,当然会提供有关的所有信息物。但是,我们也可以通过使用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没有尝试的路径首先,它失败,然后尝试执行"/bin/ls",其成功执行"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执行,而是间接地通另一命令时,它找不到。