root
身份登录时,我设置了一些环境变量,但我不记得或找不到它们的来源。 我检查了
~/.bash_profile
,/etc/.bash_rc
和所有启动脚本。 我没有正确地运行
find
和grep
。有解决这个问题的技巧吗?#1 楼
如果使用env
命令显示变量,则变量应大致按照创建顺序显示。您可以以此为指导,以了解它们是系统在启动时很早就设置还是由更高版本的.profile或其他配置文件设置。以我的经验,set
和export
命令将按字母顺序对变量进行排序,因此列出并没有那么有用。评论
很好...除了我要找出清除环境变量(在/ 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>&2
将xtrace
输出存储到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是正确的。除了使用find
和grep
之外,您无法发现它的来源。知道这确实是一个环境变量,我将尝试将搜索集中在/ 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
评论
/ etc / environment是另一个。和/etc/env.d/*文件。但是执行grep -R“ YOUR_VARIABLE” / etc /可能是找出答案的最佳方法。
在Mac OS X上,另请参阅如何查找环境变量的设置位置?
@rozcietrzewiacz最简单的方法...如果变量确实位于/ etc /下(例如,在我的情况下);如果您将其发布为答案,我会投票;)