Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
执行官不为“工作”;execv(“bin/echo”、“echo”、“PATH”)?_C_Unix - Fatal编程技术网

执行官不为“工作”;execv(“bin/echo”、“echo”、“PATH”)?

执行官不为“工作”;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和参数$PATH调用echo,输出是$PATH,而不是$PATH环境变量的实际值,这是我在bash中执行相同操作时得到的

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

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);

  • 实际上,Shell通常不调用
    /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
    更改进程的工作目录,但不要期望它应用于地狱哪一个调用你的程序。