我有一个前一段时间设置的Linux实例。当我启动并登录时root
,我设置了一些环境变量,但我不记得或找不到它们的来源。
- 我已经检查了
~/.bash_profile
,/etc/.bash_rc
和所有启动脚本。 - 我已经跑了
find
,grep
但无济于事。
我觉得我必须忘记在某个明显的地方看起来。有解决这个问题的技巧吗?
/etc/env.d/*
文件。但是做grep -R "YOUR_VARIABLE" /etc/
可能是找出答案的最好方法。
我有一个前一段时间设置的Linux实例。当我启动并登录时root
,我设置了一些环境变量,但我不记得或找不到它们的来源。
~/.bash_profile
,/etc/.bash_rc
和所有启动脚本。find
,grep
但无济于事。我觉得我必须忘记在某个明显的地方看起来。有解决这个问题的技巧吗?
/etc/env.d/*
文件。但是做grep -R "YOUR_VARIABLE" /etc/
可能是找出答案的最好方法。
Answers:
如果使用env
命令显示变量,则变量应大致按创建顺序显示。您可以以此为指导,以了解它们是系统在启动时很早设置的,还是由更高版本的.profile或其他配置文件设置的。以我的经验,set
and export
命令将按字母顺序对变量进行排序,因此列出并不是那么有用。
如果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>&2
将xtrace
输出存储到file.log
而不是在终端上)。
如果您的变量不在该变量中,那么外壳可能会在启动时继承它,因此它是像在PAM配置中一样在in中设置的~/.ssh/environment
,或者在X11会话启动时读取的内容()设置的~/.xinitrc
,~/.xsession
或者是在启动登录的服务定义上设置的管理器,甚至更早一些启动脚本。然后find /etc -type f -exec grep -F THE_VAR {} +
可能会有所帮助。
zsh -xl 2>&1
(即合并stderr和stdout输出),则可以照常进行grep。
fish
外壳?
zsh -xl 2>&1
,我也不可能正常grep。显然,输出不包含适当的换行符或其他内容。
PS4='+$BASH_SOURCE> ' BASH_XTRACEFD=7 bash -xl 7>/tmp/$(uuidgen)
,然后在该随机文件上使用grep。
@Cian是正确的。除了使用find
和之外grep
,您无济于事,无法发现它的来源。知道这确实是一个环境变量,我将尝试将搜索集中在/ etc /和主目录中。用VARIABLE
您要搜索的适当变量替换:
$ grep -r VARIABLE /etc/*
$ grep -r VARIABLE ~/.*
如果你把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_
)。
对于zsh
用户而言,跟踪(在启动过程中)访问的文件可能很有用,它们不是太多,并且可以一一查看它们以查找定义的位置。
zsh -o SOURCE_TRACE
环境变量存储在/ etc / profile文件中,因此请执行更多/ etc / profile,仅检查所需的env变量,如果/ etc / profile不存在,则在主目录中查找.profile文件
/etc/profile
,您可以在系统范围内定义它们,例如bash
当用作登录shell时。从文件和/或命令行读取定义后,它们由Shell进程存储。
例如,如果要查找HISTFILE变量及其值,或者想知道有关历史记录定义了哪些变量,则可以在shell中键入以下内容:
set | grep HIST
env | grep HIST
printenv | grep HIST
echo "$HISTFILE"
呢?
set
没有告诉您哪个文件定义了变量。
/etc/environment
是另一个。