我已经阅读了linux命令env
手册,具体来说,对于-i
选项,手册说:
-i, - ignore-environment#以空白环境开始
我得到的是,当指定-i
选项时,环境为空,即没有环境变量,因此命令env -i ls
应该打印命令未找到< / strong>,但我看到的是命令执行成功。所以请解释一下,我是否误解了什么?
答案 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
清除所有这些用户设置变量,并为您提供一个空白环境,因此,如果您没有设置这些额外变量,您可以测试命令的工作方式。