这是在互联网上找到的一段代码
#include <stdio.h>
#include <string.h>
int main(int argc, char* argv[])
{
putenv("PATH=/nothinghere");
//setenv("PATH","/nothinghere");
system(argv[1]);
return 0;
}
如果我愿意
$./a.out "ls"
sh: 1: ls: not found
当然 但是,如果
$./a.out "echo $PATH"
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
它会打印原始的$PATH
!
如果我们创建一个新的shell,请执行相同的操作
int main(int argc, char* argv[])
{
putenv("PATH=/nothinghere");
//setenv("PATH","/nothinghere");
system("/bin/sh");
return 0;
}
$./a.out
$ echo $PATH
/nothinghere
$ ls
/bin/sh: 2: ls: not found
为什么?
关于fork
或echo
的实现存在问题吗?
答案 0 :(得分:11)
这是因为您使用双引号,告诉您的shell甚至在$PATH
开始之前用PATH变量的值替换a.out
。
错误的值不是由system()
调用的shell插入的,而是由您在其中交互式地键入命令的shell插入的。
要解决此问题,请更改:
$ ./a.out "echo $PATH"
收件人:
$ ./a.out 'echo $PATH'