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


我检查了~/.bash_profile/etc/.bash_rc和所有启动脚本。
我没有正确地运行findgrep。有解决这个问题的技巧吗?

评论

/ etc / environment是另一个。

和/etc/env.d/*文件。但是执行grep -R“ YOUR_VARIABLE” / etc /可能是找出答案的最佳方法。

在Mac OS X上,另请参阅如何查找环境变量的设置位置?

@rozcietrzewiacz最简单的方法...如果变量确实位于/ etc /下(例如,在我的情况下);如果您将其发布为答案,我会投票;)

#1 楼

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

评论


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

– Michael Scheper
2015年7月23日在2:12

这没有回答他的问题。他不想知道环境变量的值,他想知道shell引用以获取该环境变量的配置文件的位置。

–安德鲁(Andrew)
19年11月27日在21:27

#2 楼

如果zsh是您的登录Shell:

zsh -xl


bash在一起:并显示已完成的所有操作(使用zsh重定向stderr的区域除外)以及当前正在解释的文件的名称。该输出中的变量。 (您可以使用script命令来帮助您存储整个外壳会话输出,或者对于bash方法,使用7> file.log而不是7>&2xtrace输出存储到file.log而不是在终端上)。如果您的变量不在其中,那么外壳可能会在启动时继承它,因此它是像在PAM配置中,在~/.ssh/environment中设置的那样设置的,或者在X11会话启动时读取的东西(~/.xinitrc~/.xsession)或在服务定义在某些启动脚本中甚至更早地启动了登录管理器。那么find /etc -type f -exec grep -F THE_VAR {} +可能会有所帮助。

评论


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

–杰弗里·黑尔(Geoffrey Hale)
17年2月10日在18:13

@GeoffreyHale如果您使用zsh -xl 2>&1,即合并stderr和stdout输出,则可以照常进行grep。

–Rakesh
17年8月7日在20:04

鱼壳有什么办法吗?

–尼克·斯威汀(Nick Sweeting)
18年5月7日在16:42

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

– bjd2385
19年9月8日14:42

神奇掌握bash

–亚历山大·伊尔朱什金
19年11月11日在19:58

#3 楼

首先要看的地方:

系统范围



/etc/environment:专门用于环境变量

/etc/env.d/*:环境变量,分为多个文件

/etc/profile:所有类型的初始化脚本

/etc/profile.d/*:初始化脚本

/etc/bashrc/etc/bash.bashrc:用于函数和别名

用户特定



~/.bash_profile:登录(bash-)shell的初始化

~/.bashrc:所有交互式的初始化(bash-)外壳

~/.profile:适用于所有外壳

~/.cshrc~/.zshrc~/.tcshrc:与非bash外壳类似

评论


这很全面!

– jdhao
20-10-15在9:22

如果在Ubuntu上也请检查〜/ .pam_environment,因为这是用于存储用户环境变量的建议位置。

–大卫
20-11-04在15:33

#4 楼

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

$ grep -r VARIABLE /etc/*

$ grep -r VARIABLE ~/.*

评论


令人惊讶的是,回答为“您不能做”的答案被回答为“是的您可以做”的答案所包围,甚至有如此之多的赞誉。

– Michael Scheper
2015年7月23日在2:14

我没有看到任何答案实际上可以提供确定在何处设置变量的方法。有一些有用的线索,但没有一线能胜任。

–安德鲁·瓦格纳(Andrew Wagner)
15年7月31日在14:13

这件事解决了我的时间。谢谢

–哈桑·拉扎(Hassan Raza)
16年1月1日在10:03

@MichaelScheper“您不能”在没有找到/ grep的情况下进行操作。稍后在“您可以”中介绍了如何使用grep进行操作

– Line
19年9月3日在8:43

#5 楼

如果将set -x放入.profile.bash_profile中,则所有后续的Shell命令将记录为标准错误,您可以查看其中是否设置了这些变量。您也可以将set -x放在/etc/profile的顶部以对其进行跟踪。输出可能非常冗长,因此您可能希望将其重定向到带有exec 2>/tmp/profile.log之类的文件。

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

#6 楼

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

#7 楼

对于zsh用户,跟踪(在启动过程中)访问的文件可能很有用,它们不是太多,并且可以一一浏览它们以查找定义的位置。


#8 楼

环境变量存储在/ etc / profile文件中,所以
在/ etc / profile文件中做更多的事情,只是检查您想要的env变量
,如果/ etc / profile不存在,则在您的主目录

评论


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

–安东
2015年1月7日,11:33

#9 楼

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

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


评论


如果您已经知道名称,为什么不呢:echo“ $ HISTFILE”?

– Jeff Schaller♦
17-3-29在1:17

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

–重要阿里耶夫
17-3-29在6:08



不幸的是,set不会告诉您哪个文件定义了变量。

– Jeff Schaller♦
17 Mar 29 '17 at 9:52