[英]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.