我有一个前段时间设置的 Linux 实例。当我启动并登录时,root
我设置了一些环境变量,但我不记得或找不到它们来自哪里。
- 我已经检查了
~/.bash_profile
、/etc/.bash_rc
和所有启动脚本。 - 我跑了
find
却grep
无济于事。
我觉得我一定忘记看某个明显的地方了。有什么技巧可以解决这个问题吗?
答案1
如果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
如果您的变量不在那里,那么 shell 可能会在启动时继承它,因此它之前已在 PAM 配置中设置,~/.ssh/environment
或者在 X11 会话启动时读取的内容(~/.xinitrc
、~/.xsession
)或在启动登录的服务定义上设置管理器甚至更早的一些启动脚本。那么find /etc -type f -exec grep -Fw THE_VAR {} +
可能会有所帮助。
答案2
首先要看的一些地方:
全系统范围
/etc/environment
:专门用于环境变量/etc/env.d/*
: 环境变量,分成多个文件/etc/profile
:所有类型的初始化脚本/etc/profile.d/*
:初始化脚本/etc/bashrc
,/etc/bash.bashrc
: 用于函数和别名
用户特定
~/.profile
:用于所有 shell~/.pam_environment
:Linux 可插入身份验证模块的一部分~/.bash_profile
:登录(bash-)shell 的初始化~/.bashrc
:所有交互式(bash-)shell 的初始化~/.cshrc
,~/.zshrc
,~/.tcshrc
:与非 bash shell 类似
答案3
如果您使用该env
命令显示变量,它们应该大致按照创建的顺序显示。您可以使用此指南来确定它们是由系统在启动初期设置的,还是由稍后的 .profile 或其他配置文件设置的。根据我的经验,set
和export
命令将按字母顺序对变量进行排序,因此列表没有那么有用。
答案4
如果您输入set -x
or .profile
,.bash_profile
则所有后续 shell 命令将被记录到标准错误,您可以查看其中之一是否设置了这些变量。您也可以将其放在set -x
顶部来追踪它。/etc/profile
输出可能非常详细,因此您可能希望将其重定向到具有类似exec 2>/tmp/profile.log
.
如果您的系统使用 PAM,请在或中查找pam_env
加载请求。该模块从指定的文件加载环境变量,如果未指定文件,则从系统默认值加载环境变量(在Debian 和 Ubuntu 上)。 Linux 上另一个包含环境变量定义的文件是(查找以 开头的行)。/etc/pam.conf
/etc/pam.d/*
/etc/environment
/etc/security/pam_env.conf
/etc/login.defs
ENV_