【问题标题】:Executing "echo $PATH" from a c program?从 c 程序执行“echo $PATH”?
【发布时间】:2010-12-02 23:56:51
【问题描述】:

我正在尝试从 C 程序显示、设置和修改 PATH 环境变量。我正在做这样的事情:-

char *cmd[] = { "echo", "$PATH", (char *)0 };
if (execlp("echo", *cmd) == -1)

但我没有得到结果。

【问题讨论】:

    标签: c linux path exec


    【解决方案1】:

    你应该使用@987654321@(),不需要通过shell:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(void)
    {
       printf("PATH='%s'\n", getenv("PATH"));
    
       return EXIT_SUCCESS;
    }
    

    但是你不会能够改变这个值。环境变量被继承到子进程中,但子进程有自己的副本。您不能从不同的程序更改 shell 的环境,无论它是用哪种语言编写的。您当然可以更改自己的流程值,但这不是您要求做的。

    在 shell 本身中,您可以更改其当前环境设置,但仅限于此。这就是为什么您需要使用“源”来运行改变环境的 shell 脚本。

    【讨论】:

    • 你很快。我要补充一点,您可以输入 man getenv 以获得信息丰富的手册页。
    • 谢谢。最让我慢下来的事情是奇怪的无法在降价编辑器中输入反斜杠。 :)
    • 放松,我从来没有遇到过反斜杠的问题......但这一定是你的字符串中没有右单引号的原因;-)
    • @hacker:谢谢,已修复。每当我在答案编辑器中按反斜杠时,它会立即被enter code here 替换,并选择文本部分,以便下一次按键替换它。
    • 放松。诡异的。从来没有发生在我身上(还)。
    【解决方案2】:

    如果你想显示$PATH,试试这个:

    #include <stdlib.h>
    
    printf("PATH: %s\n",getenv("PATH"));
    

    如果要修改,请使用setenv()putenv()

    【讨论】:

      【解决方案3】:

      试试这个:

      char *cmd[] = { "$PATH", (char *)0 };
      if (execlp("echo", cmd) == -1)
      

      【讨论】:

        【解决方案4】:
        #include <stdio.h>
        #include <stdlib.h>
        
        ...
        
        char *pPath;
        pPath = getenv("PATH");
        if (pPath!=NULL)
            printf ("The current path is: %s",pPath);
        putenv("PATH=somepath");
        
        ...
        

        【讨论】:

          【解决方案5】:

          已经给出了更好的解决方案,但只是作为解释; $PATH 变量由命令 shell 解析和翻译,而不是 echo 命令本身。已经建议的解决方案使用 getenv() 来获取环境变量的值。

          调用命令外壳来执行此操作:

          system( "echo $PATH" ) ;
          

          但该解决方案有点重量级,因为它调用一个新进程和整个命令处理器只是为了做到这一点。

          【讨论】:

            猜你喜欢
            • 2010-09-09
            • 1970-01-01
            • 2016-10-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-06-24
            相关资源
            最近更新 更多