如何确定环境变量来自何处?


153

我有一个前一段时间设置的Linux实例。当我启动并登录时root,我设置了一些环境变量,但我不记得或找不到它们的来源。

  • 我已经检查了~/.bash_profile/etc/.bash_rc和所有启动脚本。
  • 我已经跑了findgrep但无济于事。

我觉得我必须忘记在某个明显的地方看起来。有解决这个问题的技巧吗?


6
/etc/environment是另一个。
derobert

8
/etc/env.d/*文件。但是做grep -R "YOUR_VARIABLE" /etc/可能是找出答案的最好方法。
rozcietrzewiacz

1
在Mac OS X上,另请参阅如何找到设置环境变量的位置?
吉尔斯

@rozcietrzewiacz最简单的方法...如果变量确实位于/ etc /下(如我的情况);如果你张贴的答案,我会给予好评;)
在线

Answers:


55

如果使用env命令显示变量,则变量应大致按创建顺序显示。您可以以此为指导,以了解它们是系统在启动时很早设置的,还是由更高版本的.profile或其他配置文件设置的。以我的经验,setand export命令将按字母顺序对变量进行排序,因此列出并不是那么有用。


1
很好...除了我要找出清除环境变量(在/ etc / environment中设置)的内容外。:-)(是的,它是最初设置的...我正在各种脚本中添加行以记录其清除的位置...)
Michael Scheper 2015年

127

如果zsh是您的登录shell:

zsh -xl

bash

PS4='+$BASH_SOURCE> ' BASH_XTRACEFD=7 bash -xl 7>&2

这将模拟一个登录shell,并显示完成的所有操作(使用stderr重定向的区域除外zsh)以及当前正在解释的文件名。

因此,您要做的就是在该输出中查找环境变量的名称。(您可以使用该script命令来帮助您存储整个shell会话输出,或者对于该bash方法,使用7> file.log而不是7>&2xtrace输出存储到file.log而不是在终端上)。

如果您的变量不在该变量中,那么外壳可能会在启动时继承它,因此它是像在PAM配置中一样在in中设置的~/.ssh/environment,或者在X11会话启动时读取的内容()设置的~/.xinitrc~/.xsession或者是在启动登录的服务定义上设置的管理器,甚至更早一些启动脚本。然后find /etc -type f -exec grep -F THE_VAR {} +可能会有所帮助。


4
令人印象深刻且乐于助人,谢谢。对于我们n00bs,您能否解释一下有关该模式的更多信息,以及如何摆脱这种模式?例如,我们不能简单地通过管道将这个输出输出给grep。
杰弗里·黑尔

5
@GeoffreyHale如果您zsh -xl 2>&1(即合并stderr和stdout输出),则可以照常进行grep。
拉克什

1
有什么办法可以做到这一点的fish外壳?
Nick Sweeting

即使我使用zsh -xl 2>&1,我也不可能正常grep。显然,输出不包含适当的换行符或其他内容。
Xerus

我认为您可以只使用PS4='+$BASH_SOURCE> ' BASH_XTRACEFD=7 bash -xl 7>/tmp/$(uuidgen),然后在该随机文件上使用grep。
bd1251252

50

首先要看的地方:

系统范围

  • /etc/environment:专门用于环境变量
  • /etc/env.d/*:环境变量,分为多个文件
  • /etc/profile:所有类型的初始化脚本
  • /etc/profile.d/*:初始化脚本
  • /etc/bashrc/etc/bash.bashrc:用于功能和别名

用户特定

  • ~/.bash_profile:初始化登录(bash-)shell
  • ~/.bashrc:初始化所有交互式(bash)shell
  • ~/.profile:用于所有外壳
  • ~/.cshrc~/.zshrc~/.tcshrc:类似的非bash的壳

31

@Cian是正确的。除了使用find和之外grep,您无济于事,无法发现它的来源。知道这确实是一个环境变量,我将尝试将搜索集中在/ etc /和主目录中。用VARIABLE您要搜索的适当变量替换:

$ grep -r VARIABLE /etc/*

$ grep -r VARIABLE ~/.*


1
令人惊讶的是,回答为“您不能做”的答案被回答为“是的您可以做”的答案包围了这么多投票。
Michael Scheper

我没有看到任何答案,实际上没有办法确定设置变量的位置。有一些有用的线索,但没有一线能胜任。
安德鲁·瓦格纳

这件事解决了我的时间。谢谢。
哈桑·拉扎

@MichaelScheper“您不能”在没有找到/ grep的情况下进行操作。后来在“可以”它描述了如何做到这一点用grep
在线

23

如果你把set -x你的.profile还是.bash_profile,所有后续的shell命令将被记录到标准错误,你可以看到,如果他们中的一个将这些变量。您也可以将其放在set -x顶部/etc/profile。输出的内容可能非常冗长,因此您可能需要使用将该内容重定向到文件exec 2>/tmp/profile.log

如果您的系统使用PAM,pam_env请在/etc/pam.conf或中查找负载请求/etc/pam.d/*。这从指定的文件模块加载环境变量,或从系统默认的,如果没有指定文件(/etc/environment/etc/security/pam_env.conf在Debian和Ubuntu)。在Linux上,另一个具有环境变量定义的文件是/etc/login.defs(查找以开头的行ENV_)。


5

检查你的启动脚本文件,他们源使用.(点)或source。这些文件可能位于/etc和之外的其他目录中$HOME



0

环境变量存储在/ etc / profile文件中,因此请执行更多/ etc / profile,仅检查所需的env变量,如果/ etc / profile不存在,则在主目录中查找.profile文件


1
环境变量存储在中/etc/profile,您可以在系统范围内定义它们,例如bash当用作登录shell时。从文件和/或命令行读取定义后,它们由Shell进程存储。
Anthon 2015年

-2

例如,如果要查找HISTFILE变量及其值,或者想知道有关历史记录定义了哪些变量,则可以在shell中键入以下内容:

set | grep HIST
env | grep HIST
printenv | grep HIST

如果您已经知道名字,为什么不echo "$HISTFILE"呢?
杰夫·谢勒

因为,我们想在哪里找到$ HISTFILE变量的定义。另外,如果我想知道历史定义了哪些变量
Vusal Aliyev

2
不幸的是,set没有告诉您哪个文件定义了变量。
杰夫·谢勒
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.