在system()中回显$ PATH给我错误的输出

时间:2018-08-16 20:50:29

标签: c linux shell

这是在互联网上找到的一段代码

#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

为什么? 关于forkecho的实现存在问题吗?

1 个答案:

答案 0 :(得分:11)

这是因为您使用双引号,告诉您的shell甚至在$PATH 开始之前用PATH变量的值替换a.out

错误的值不是由system()调用的shell插入的,而是由您在其中交互式地键入命令的shell插入的。

要解决此问题,请更改:

$ ./a.out "echo $PATH"

收件人:

$ ./a.out 'echo $PATH'