如何确定环境变量来自哪里?

Joe*_*oel 219 shell bash environment-variables

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

  • 我已检查~/.bash_profile/etc/.bash_rc和所有启动脚本。
  • 我跑了findgrep没有用。

我觉得我一定是忘了看某个明显的地方。有什么技巧可以解决这个问题吗?

Sté*_*las 201

如果zsh是您的登录外壳:

zsh -xl
Run Code Online (Sandbox Code Playgroud)

bash

PS4='+$BASH_SOURCE> ' BASH_XTRACEFD=7 bash -xl 7>&2
Run Code Online (Sandbox Code Playgroud)

这将模拟登录 shell 并显示已完成的所有内容(除了使用 重定向 stderr 的区域zsh)以及当前正在解释的文件的名称。

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

如果你的变量不在那里,那么 shell 可能在启动时继承了它,所以它是在 PAM 配置中设置的,在~/.ssh/environment, 或者在你的 X11 会话启动时读取的内容 ( ~/.xinitrc, ~/.xsession) 或在启动登录的服务定义时设置manager 甚至更早的一些引导脚本。那么 afind /etc -type f -exec grep -F THE_VAR {} +可能会有所帮助。

  • @GeoffreyHale 如果你`zsh -xl 2>&1`,即合并stderr和stdout输出,你可以像往常一样grep。 (9认同)
  • 令人印象深刻且乐于助人,谢谢。对于我们 n00bs,您能否详细解释一下这种模式以及我们如何摆脱这种模式?例如,我们不能简单地通过管道 grep 这个输出。 (6认同)
  • 有没有办法用“fish”外壳来做到这一点? (2认同)
  • 对 bash 的神奇掌握 (2认同)

小智 90

一些先看的地方:

系统范围

  • /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 shell 类似

  • 如果在 Ubuntu 上,还要检查 `~/.pam_environment`,因为这是用于存储用户环境变量的 [推荐位置](https://help.ubuntu.com/community/EnvironmentVariables#A.2BAH4-.2F.pam_environment)。 (3认同)

小智 77

如果您使用该env命令来显示变量,它们应该大致按照它们的创建顺序显示。您可以使用它作为指导,以确定它们是在引导的早期由系统设置的,还是由稍后的 .profile 或其他配置文件设置的。根据我的经验,setexport命令将按字母顺序对其变量进行排序,因此列表没有那么有用。

  • 这并不能回答他的问题。他不想知道环境变量的值,他想知道 shell 为获取该环境变量而引用的配置文件的位置。 (4认同)
  • 太好了......除了我试图找出什么是*清除*环境变量(在/etc/environment中设置)。:-)(是的,它最初是设置的......我在脚本中添加了各种行以记录它被清除的位置......) (2认同)

Aar*_*nce 43

@Cian 是正确的。除了使用findand 之外grep,没有什么可以做来发现它的来源。知道它确实是一个环境变量,我会尝试将您的搜索集中在 /etc/ 和您的主目录中。替换VARIABLE为您正在搜索的适当变量:

$ grep -r VARIABLE /etc/*

$ grep -r VARIABLE ~/.*

  • 令人惊讶的是,一个说“你不能”的答案,周围都是说“是的,你可以”的答案,竟然有这么多的赞成票。 (3认同)

Gil*_*il' 26

如果您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_)。


Den*_*son 5

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


小智 5

对于zsh用户来说,跟踪(在启动期间)访问的文件可能很有用,它们不会太多,可以逐一查看它们的定义位置。

zsh -o SOURCE_TRACE
Run Code Online (Sandbox Code Playgroud)