【问题标题】:echo $PATH in system() give me a wrong output [duplicate]echo $PATH in system() 给我一个错误的输出[重复]
【发布时间】: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

标签: c linux shell


【解决方案1】:

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

因此,插入的错误值不是由system() 调用的外壳程序,而是由您以交互方式键入命令的外壳程序。

要修复它,请更改:

$ ./a.out "echo $PATH"

到:

$ ./a.out 'echo $PATH'

【讨论】:

  • 哦...我明白了,谢谢
猜你喜欢
  • 2016-09-10
  • 1970-01-01
  • 2016-10-19
  • 2017-10-09
  • 2023-03-13
  • 2019-05-15
  • 2016-12-29
  • 1970-01-01
  • 2018-08-21
相关资源
最近更新 更多