目錄
1 什么是進程的環境變量
2 環境變量的作用
3?應用程序中獲取環境變量
3.1?environ全局變量
3.2?獲取指定環境變量 getenv
4?添加/刪除/修改環境變量
4.1?putenv()函數添加環境變量
4.2?setenv()函數
4.3?unsetenv()函數
1 什么是進程的環境變量
每一個進程都有一組與其相關的環境變量, 這些環境變量以字符串形式存儲在一個字符串數組列表中,把這個數組稱為環境列表。 其中每個字符串都是以“名稱=值(name=value)” 形式定義,所以環境變量是“名稱-值”的成對集合。
譬如在 shell 終端下可以使用 env 命令查看到 shell 進程的所有環境變量,如下所示:
使用 export 命令還可以添加一個新的環境變量或刪除一個環境變量:
export LINUX_TEST=123456 # 添加 LINUX_TEST 環境變量
使用"export -n LINUX_TEST"命令則可以刪除 LINUX_TEST 環境變量。
2 環境變量的作用
環境變量主要有以下幾個作用:
-
配置應用程序:環境變量可以用于存儲應用程序的配置信息,如文件路徑、配置選項等。這使得應用程序可以在不同的環境中使用相同的代碼,但根據環境變量的不同而表現出不同的行為。
-
傳遞信息:在進程創建時,父進程的環境變量可以傳遞給子進程。這允許在不同程序之間共享信息,例如,用戶的家目錄路徑通常通過環境變量
HOME
傳遞。 -
控制shell行為:在shell中,環境變量控制著許多行為,如提示符的格式、別名、shell腳本的搜索路徑等。
3?應用程序中獲取環境變量
3.1?environ全局變量
應用程序當中也可以獲取當前進程的環境變量,事實上,進程的環境變量是從其父進程中繼承過來的,譬如在 shell 終端下執行一個應用程序,那么該進程的環境變量就是從其父進程(shell 進程)中繼承過來的。新的進程在創建之前,會繼承其父進程的環境變量副本。
環境變量存放在一個字符串數組中,在應用程序中,通過 environ 變量指向它, environ 是一個全局變量,在我們的應用程序中只需申明它即可使用,如下所示:
extern char **environ; // 申明外部全局變量 environ
編寫應用程序,獲取進程的所有環境變量。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>extern char **environ;int main()
{// 遍歷環境變量數組while (*environ != NULL) {printf("%s\n", *environ);environ++;}return 0;
}
運行結果如下,可以看到和‘evn’命令行有相同的結果。
3.2?獲取指定環境變量 getenv
如果只想要獲取某個指定的環境變量,可以使用庫函數 getenv(),其函數原型如下所示:
#include <stdlib.h>char *getenv(const char *name);
- name: 指定獲取的環境變量名稱。
- 返回值: 如果存放該環境變量,則返回該環境變量的值對應字符串的指針;如果不存在該環境變量,則返回 NULL。
下面是一個使用 getenv()
函數獲取這個環境變量的值的示例程序:
#include <stdio.h>
#include <stdlib.h>int main(int argc, char *argv[])
{// 檢查是否提供了環境變量名稱作為命令行參數if (argc != 2) {printf("Usage: %s <environment-variable-name>\n", argv[0]);return 1;}// 獲取環境變量的值const char *value = getenv(argv[1]);if (value != NULL) {printf("The value of '%s' is: %s\n", argv[1], value);} else {printf("The environment variable '%s' is not set.\n", argv[1]);}return 0;
}
?通過程序查看SHELL環境變量的值,
4?添加/刪除/修改環境變量
C 語言函數庫中提供了用于修改、添加、刪除環境變量的函數,譬如 putenv()、 setenv()、 unsetenv()、clearenv()函數等。
4.1?putenv()函數添加環境變量
putenv()
函數用于添加或修改環境變量的函數。它接收一個字符串參數,該字符串應該包含環境變量的名稱和值,兩者之間用等號(=
)連接。如果環境變量已經存在,putenv()
會更新它的值;如果不存在,它將添加一個新的環境變量。其函數原型如下所示:
#include <stdlib.h>int putenv(char *string);
- string: 參數 string 是一個字符串指針,指向 name=value 形式的字符串。
- 返回值: 成功返回 0;失敗將返回非 0 值,并設置 errno。
使用 putenv()函數為當前進程添加一個環境變量。
#include <stdio.h>
#include <stdlib.h>int main(int argc, char *argv[])
{if (2 > argc) {fprintf(stderr, "Error: 傳入 name=value\n");exit(-1);}/* 添加/修改環境變量 */if (putenv(argv[1])) {perror("putenv error");exit(-1);}exit(0);
}
運行結果如下:
4.2?setenv()函數
setenv()函數可以替代 putenv()函數,用于向進程的環境變量列表中添加一個新的環境變量或修改現有環境變量對應的值,其函數原型如下所示:
#include <stdlib.h>int setenv(const char *name, const char *value, int overwrite);
- name: 需要添加或修改的環境變量名稱。
- value: 環境變量的值。
- overwrite: 若參數 name 標識的環境變量已經存在,在參數 overwrite 為 0 的情況下, setenv()函數將不改變現有環境變量的值,也就是說本次調用沒有產生任何影響;如果參數 overwrite 的值為非 0,若參數 name標識的環境變量已經存在,則覆蓋,不存在則表示添加新的環境變量。
- 返回值: 成功返回 0;失敗將返回-1,并設置 errno。
setenv()與 putenv()函數有兩個區別:
- putenv()函數并不會為 name=value 字符串分配內存;
- setenv()可通過參數overwrite控制是否需要修改現有變量的值而僅以添加變量為目的,顯然putenv()并不能進行控制。
setenv()函數使用示例程序如下:
#include <stdio.h>
#include <stdlib.h>int main(int argc, char *argv[])
{// 檢查是否提供了環境變量名稱和值if (argc != 3) {printf("Usage: %s <variable-name> <value>\n", argv[0]);return 1;}// 使用 setenv 函數添加或修改環境變量// setenv 返回 0 表示成功,非 0 表示錯誤if (setenv(argv[1], argv[2], 1) != 0) {perror("Failed to set environment variable");return 1;}// 打印環境變量的值以驗證const char *value = getenv(argv[1]);if (value != NULL) {printf("%s is now set to: %s\n", argv[1], value);} else {printf("Failed to retrieve the set environment variable.\n");}return 0;
}
程序首先檢查是否提供了正確的參數數量。如接下來,程序使用 setenv()
函數來設置環境變量。setenv()
的第三個參數設置為 1,表示如果環境變量已經存在,允許覆蓋它的值。然后,程序使用 getenv()
函數來驗證環境變量是否已正確設置,并打印出它的值。運行結果如下:
4.3?unsetenv()函數
unsetenv()
是 POSIX 標準中定義的一個函數,用于從當前進程的環境中刪除指定的環境變量。這個函數的原型通常如下:
#include <stdlib.h>int unsetenv(const char *name);
name
:要刪除的環境變量的名稱。- 返回值:如果環境變量成功被刪除,
unsetenv()
會返回 0;如果發生錯誤,比如嘗試刪除不存在的變量,會返回非零值。
下面是一個使用 unsetenv()
函數的示例程序,它接受一個命令行參數(環境變量的名稱),并嘗試從當前進程的環境中刪除這個變量:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>int main(int argc, char *argv[])
{// 檢查是否提供了環境變量名稱if (argc != 2) {printf("Usage: %s <environment-variable-name>\n", argv[0]);return 1;}// 嘗試刪除環境變量if (unsetenv(argv[1]) == -1) {perror("Failed to unset environment variable");return 1;}// 驗證環境變量是否被刪除const char *value = getenv(argv[1]);if (value == NULL) {printf("The environment variable '%s' has been unset.\n", argv[1]);} else {printf("The environment variable '%s' is still set to: %s\n", argv[1], value);}return 0;
}
運行結果如下:?
?