簡體   English   中英

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

[英]How to use execve or execvp to print $PATH

當我使用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()正確回顯環境變量?

execvp不會運行shell,所以env。 變量不會被評估。

使用system會起作用,因為它在shell中運行命令:

system("echo $PATH");

雖然對於這個特殊情況,最簡單和最干凈的是getenv (它也更便攜:也適用於Windows)

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

$$PATH )由shell處理。 閱讀shell參數擴展

如果您只想獲取PATH變量,請使用getenv(3)作為getenv("PATH") (不需要使用main的第三個參數,正如t0mm13b回答的那樣 )。

如果你堅持通過execvp獲取它,你需要exec/bin/sh -c "echo $PATH"這樣的東西(所以你的a execvp三個非空參數,最后一個非空參數是"echo $PATH"字符串)。

如果你堅持要顯示所有環境變量(參見environ(7) ...),你可以使用extern char **environ; 全局變量,或使用env(1)程序(不帶參數)或printenv(1)之一。 crt0啟動例程將設置environ

第三個參數用於main ,是如何獲取所使用的環境變量的。 當運行時加載程序執行代碼時,參數計數,參數和環境變量將傳遞到啟動中。

輸出將包含一個字符串,該字符串具有環境變量名稱和由=分隔的值

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

例如,請參閱此ideone代碼段

結果類似於:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM