it-swarm.cn

如何确定环境变量来自何处?

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

  • 我检查了~/.bash_profile/etc/.bash_rc,以及所有启动脚本。
  • 我已经运行findgrep无济于事。

我觉得我必须忘记在某个明显的地方看起来。有解决这个问题的技巧吗?

177
Joel

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

63
Ben Combee

如果zsh是您的登录Shell:

zsh -xl

使用bash

PS4='+$BASH_SOURCE> ' BASH_XTRACEFD=7 bash -xl 7>&2

这将模拟登录Shell,并显示完成的所有操作(使用zsh重定向stderr的区域除外)以及当前正在解释的文件的名称。

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

如果您的变量不在其中,那么Shell可能会在启动时继承它,因此它是像在PAM配置中一样在~/.ssh/environment,或X11会话启动时读取的内容(~/.xinitrc~/.xsession)或在启动登录管理器或更早的启动脚本中启动的服务定义上进行设置。然后是find /etc -type f -exec grep -F THE_VAR {} +可能会有所帮助。

158
Stéphane Chazelas

首先要看的地方:

系统范围

  • /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壳类似
65
beetstra

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

$ grep -r VARIABLE /etc/*

$ grep -r VARIABLE ~/.*

34
Aaron Toponce

如果将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_开头的行)。

24

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

5

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

zsh -o SOURCE_TRACE
4
Erik Zivkovic

环境变量存储在/ etc/profile文件中,因此请执行更多/ etc/profile,仅检查所需的env变量,如果/ etc/profile不存在,则在主目录中查找.profile文件

0
Sarvesh Pawar