-2

我使用带有参数的 execv 调用 echo : $PATH 并且输出是 $PATH 而不是 $PATH 环境变量的实际值,这是我在 bash 中执行相同操作时得到的值。

为什么会这样?我传递了所有正确的论点..

execv("/bin/echo", ["echo","$PATH"]);

谢谢。

4

4 回答 4

1

Bash 在将参数发送到之前将 $PATH 更改为环境变量 PATH 的值cat。但是,execv()不这样做,因此 cat 接收文字字符串$PATH作为参数。要获取 PATH 环境变量,请将“PATH”传递给getenv

于 2013-10-31T15:24:45.150 回答
1

当你写

echo $PATH

在 shell 中,是你的 shell ( bash, csh, ksh, ...) 执行环境变量的扩展$PATHecho实际上从来没有看到$PATH,但已经在其命令行上获得了扩展的值。1

如果要从 C 程序中获取环境变量的内容,则必须使用getenv

const char *args[2]={"echo", getenv("PATH")};
execv("/bin/echo", args);

  1. 实际上,通常 shell 不会调用/bin/echo,而是调用它们的内置echo指令,但这在这里无关紧要。
于 2013-10-31T15:25:12.013 回答
1

bash解释和扩展表达式,例如$PATH,而不是操作系统。您准确地传递execv您希望程序作为参数接收的字符串,从字面上看,不带引号、转义字符、shell 扩展等,等等。

用于getenv查找环境变量的值,例如PATH.

于 2013-10-31T15:25:17.247 回答
0

在 C 中,字符串文字"$PATH"只是一个 5 个字符的字符串(6 个包括终止符'\0')。没有像 bash 那样扩展对环境变量的引用的机制。

如果要扩展环境变量的值,可以使用标准getenv()函数:getenv("PATH").

我不知道有任何标准函数可以识别$VARshell 识别的语法。

于 2013-10-31T15:26:38.547 回答