我使用带有参数的 execv 调用 echo : $PATH 并且输出是 $PATH 而不是 $PATH 环境变量的实际值,这是我在 bash 中执行相同操作时得到的值。
为什么会这样?我传递了所有正确的论点..
execv("/bin/echo", ["echo","$PATH"]);
谢谢。
Bash 在将参数发送到之前将 $PATH 更改为环境变量 PATH 的值cat
。但是,execv()
不这样做,因此 cat 接收文字字符串$PATH
作为参数。要获取 PATH 环境变量,请将“PATH”传递给getenv。
当你写
echo $PATH
在 shell 中,是你的 shell ( bash
, csh
, ksh
, ...) 执行环境变量的扩展$PATH
,echo
实际上从来没有看到$PATH
,但已经在其命令行上获得了扩展的值。1
如果要从 C 程序中获取环境变量的内容,则必须使用getenv
:
const char *args[2]={"echo", getenv("PATH")};
execv("/bin/echo", args);
/bin/echo
,而是调用它们的内置echo
指令,但这在这里无关紧要。bash
解释和扩展表达式,例如$PATH
,而不是操作系统。您准确地传递execv
您希望程序作为参数接收的字符串,从字面上看,不带引号、转义字符、shell 扩展等,等等。
用于getenv
查找环境变量的值,例如PATH
.
在 C 中,字符串文字"$PATH"
只是一个 5 个字符的字符串(6 个包括终止符'\0'
)。没有像 bash 那样扩展对环境变量的引用的机制。
如果要扩展环境变量的值,可以使用标准getenv()
函数:getenv("PATH")
.
我不知道有任何标准函数可以识别$VAR
shell 识别的语法。