我使用带有参数的 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").
我不知道有任何标准函数可以识别$VARshell 识别的语法。