执行官不为“工作”;execv(“bin/echo”、“echo”、“PATH”)?
我使用execv和参数$PATH调用echo,输出是$PATH,而不是$PATH环境变量的实际值,这是我在bash中执行相同操作时得到的 为什么会这样?我正在传递所有正确的论点执行官不为“工作”;execv(“bin/echo”、“echo”、“PATH”)?,c,unix,C,Unix,我使用execv和参数$PATH调用echo,输出是$PATH,而不是$PATH环境变量的实际值,这是我在bash中执行相同操作时得到的 为什么会这样?我正在传递所有正确的论点 execv("/bin/echo", ["echo","$PATH"]); 谢谢。在将参数发送到cat之前,Bash将$PATH更改为环境变量PATH的值。但是,execv()不会这样做,因此cat将文本字符串$PATH作为参数接收。要获取PATH环境变量,请在写入时将“PATH”传递给。 echo $PATH 在s
execv("/bin/echo", ["echo","$PATH"]);
谢谢。在将参数发送到
cat
之前,Bash将$PATH更改为环境变量PATH的值。但是,execv()
不会这样做,因此cat将文本字符串$PATH
作为参数接收。要获取PATH环境变量,请在写入时将“PATH”传递给。
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中,字符串literal“$PATH”
只是一个5个字符的字符串(6个包括终止的'\0'
)。没有任何机制可以像bash那样扩展对环境变量的引用
如果要扩展环境变量的值,可以使用标准的getenv()
函数:getenv(“PATH”)
我不知道有任何标准函数能够识别shell识别的
$VAR
语法。显示实际代码。@KeithThompson它在标题中。@RamchandraApte:不,它不是;标题中的代码是一个语法错误。@user1479589:你到底觉得什么有趣?如果您想更新您的问题以向我们展示您编写的实际代码,那么就更容易给出有意义的答案。@AaronMcDaid:不,将[
更改为{
不会有帮助。C的复合文本(在C99中引入,而不是C11中——我们甚至不讨论C++)需要一个括号内的类型名称。在任何情况下,OP显然已经有了可编译的代码,因为他正在描述它的运行时行为;他只需要向我们展示它。感谢您的快速回复,我现在理解了:)另外,您知道为什么cd也不能以相同的方式工作吗,例如:execv(“/bin/cd”、[“cd”、“.”)?甚至cd参数的路径..仍然不起作用..因为没有/bin/cd
。它无法工作,因为每个进程都有自己的工作目录;当进程终止时,所有这些都是历史记录。使用库函数chdir
更改进程的工作目录,但不要期望它应用于地狱哪一个调用你的程序。