如何使用execve或execvp来打印$ PATH

问题描述 投票:1回答:3

当我使用terminal运行echo $PATH命令时,它将显示PATH环境变量。

例如,像这样:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

但是,当我使用execvp()来调用它时,它只会打印字符串“$ PATH”。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <ctype.h>

int main(int argc, const char* argv[]) {
    char* a[] = {"echo", "$PATH", NULL};
    execvp("echo", a);
    exit(0);
}

输出是:$PATH

我怎样才能使用execvp()正确回应环境变量?

c system-calls
3个回答
3
投票

execvp不会运行shell,所以env。变量不会被评估。

使用system会起作用,因为它在shell中运行命令:

system("echo $PATH");

虽然对于这个特殊情况,最简单和最干净的是getenv(它也更便携:也适用于Windows)

const char *value = getenv("PATH");
if (value!=NULL)
{
   puts(value);
}

2
投票

$(在$PATH)由shell处理。了解shell parameter expansion

如果你只是想让PATH variable使用getenv(3)作为getenv("PATH")(没有必要使用main的第三个参数,如answered by t0mm13b)。

如果你坚持通过execvp得到它,你需要exec/bin/sh -c "echo $PATH"(所以execvpa的三个非空参数,最后一个非空参数是"echo $PATH"字符串)。

如果您坚持要显示所有环境变量(请参阅environ(7) ...),您可以使用extern char **environ;全局变量,或使用env(1)程序(不带参数)或printenv(1)程序。 crt0启动例程将设置environ


1
投票

第三个参数对main的使用,是如何获取所使用的环境变量。当运行时加载程序执行代码时,参数计数,参数和环境变量将传递到启动中。

输出将包含一个字符串,该字符串具有由=分隔的环境变量名称和值

int main(int argc, char **argv, char **envp){
    while (*envp){
        printf("%s\n", *envp++);
    }
}

例如,请参阅此ideone snippet

结果类似于:

PATH =在/ usr / local / bin目录:在/ usr / bin中:/ bin中

编辑:不是循环遍历所有环境变量,只是为了得到一个,使用strstr查找包含PATH的字符串,然后,将字符串“PATH =”的长度添加到从strstr重新调整的指针将产生的值环境变量PATH

int main(int argc, char **argv, char **envp){
    while (*envp){
        char *ptrPath = strstr(*envp, "PATH");
        if (ptrPath) printf("%s\n", (ptrPath+5));
        *envp++;
    }
    return 0;
}

第二编辑:

正如@jonathanleffler指出我的boo-boo,这是编辑,完成字符串操作以获得字符串“PATH”的完全匹配。

int main(int argc, char **argv, char **envp){
    while (*envp){
        char *ptrPath = strstr(*envp, "PATH");
        char *exact = NULL;
        if (ptrPath){
            char *ptrDelim = strrchr(*envp, '=');
            if (ptrDelim){
                size_t ptrDelimLen = (ptrDelim - *envp + 1);
                exact = malloc(ptrDelimLen + 1);
                strncpy(exact, *envp, ptrDelimLen);
                exact[ptrDelimLen - 1]='\0';
                if (!strcmp(exact, "PATH") && strlen(exact) == 4){
                    printf("%s\n", (ptrPath+5));
                }
            }
        }
        *envp++;
    }
    return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.