【发布时间】:2019-01-23 21:25:29
【问题描述】:
这是在网上找到的一段代码
#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 的实现有问题?
【问题讨论】:
-
在你的命令之前运行
set -x,它会告诉你它在做什么。 -
fprintf(stderr, "argv[1]=%s\n", argv[1]);同样可以避免这种混淆。 -
我意识到这个问题现在很愚蠢.....
-
@Terrynini 我们都必须从某个地方开始:P