找出命令使用的环境变量

时间:2011-12-13 18:43:13

标签: linux environment-variables xubuntu

在Linux环境中(在我的例子中是XUbuntu),有没有办法找出从控制台运行的命令访问哪些环境变量?

必须有可能找到这些变量,因为有人必须为程序提供值。但是有一些默认方法可以做到吗?

这里讨论的程序是xprintidle。

提前致谢, 斯特

4 个答案:

答案 0 :(得分:8)

假设您希望某个进程运行命令实际使用的变量,您可以使用ltrace并查找对getenv的调用:

$ ltrace -e getenv ./your_program

当然,可以计算getenv的参数(因此你无法真正预测它)。

但是,某些(旧的或奇怪的)应用程序可能会使用environ全局或main的第三个可选参数;一些应用程序甚至使用putenvsetenvunsetenv来更改其环境(所有3个都是libc函数,而不是shell内置函数。)

xprintidle主要与Xorg服务器进行交互。我很惊讶您期望它使用许多环境变量(DISPLAY除外)。

答案 1 :(得分:3)

您是指实际访问过的,还是为进程定义的环境变量?

对于已定义的环境,您可以使用:

perl -pe 's,\00,\n,g' /proc/xxxx/environ

其中xxxx是您的流程的PID。

对于已访问的变量,您必须使用ltrace之类的内容并检查对getenv()的调用。

答案 2 :(得分:0)

如果您需要环境变量列表,那么可以使用env

完成

但确定程序访问哪些变量是不可能的,因为它们都按原样传递。

答案 3 :(得分:0)

您可以使用printenv命令查看传递给程序的环境变量。

程序可以查看其环境的一种方法是使用getenv调用,因此您可以使用跟踪程序或LD_PRELOAD技巧来包装该调用并找出它们要查找的内容

但是,并非所有程序都使用getenv查看其环境。如果程序对main使用以下(不常见)格式,它可以通过envp指针查看环境变量:

int main(int argc, char *argv[], char *envp[]) {
    /* ... */
}

此外,程序可以通过environ变量访问环境。

你可能会通过追踪getenv电话获得好运,但不能保证 - 因程序而异。