在Linux环境中(在我的例子中是XUbuntu),有没有办法找出从控制台运行的命令访问哪些环境变量?
必须有可能找到这些变量,因为有人必须为程序提供值。但是有一些默认方法可以做到吗?
这里讨论的程序是xprintidle。
提前致谢, 斯特
答案 0 :(得分:8)
假设您希望某个进程运行命令实际使用的变量,您可以使用ltrace并查找对getenv的调用:
$ ltrace -e getenv ./your_program
当然,可以计算getenv
的参数(因此你无法真正预测它)。
但是,某些(旧的或奇怪的)应用程序可能会使用environ
全局或main
的第三个可选参数;一些应用程序甚至使用putenv,setenv或unsetenv
来更改其环境(所有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电话获得好运,但不能保证 - 因程序而异。