【发布时间】:2014-04-20 13:41:42
【问题描述】:
我想在 C 程序中更改 PATH 变量的值,然后在我运行该程序的 shell 中查看更改后的值。
做这样的事情,
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int main () {
char *path = getenv ("PATH");
printf ("%s\n\n", path);
setenv ("PATH", strcat (path, ":~/myNewPath/"), 1);
printf ("%s\n\n", path);
int pid = fork ();
if (pid == -1)
abort ();
if (pid == 0) {
} else {
// use execlp? how? source? any hints?
}
return 0;
}
如果我在exec* 系统调用中使用source 命令。在 shell 中向后更新这个 PATH 变量的语法是什么?
【问题讨论】:
-
注意:
setenv ("PATH", strcat (path, ":~/myNewPath/"), 1);可能会出现段错误。 -
@wildplasser 不,不会的。为什么?
-
因为您不能安全地将字符附加到 getenv() 返回的指针值所指向的字符串。如果您的 stcat() 没有段错误,那纯粹是巧合/运气。另外:getenv() 可以返回 NULL。
-
wildplasser 非常正确:它可能 不会 出现段错误,因为字符串位于更大的可写内存区域中(如我链接到的 ABI 文档中所述),但它可能将覆盖相邻的数据(很可能是其他环境字符串)。
-
还有一个额外的问题:波浪号不会被扩展,因为没有涉及到 {ksh,bash} shell。 (Linux手册页对此相当模糊)