我想知道linux操作系统给出的标准环境变量(如PATH、HOME)是如何自动设置的。这些是从哪个文件中读取的。当特定用户登录时,应该有一些文件可以设置这些变量。
答案1
您的问题的答案可以在INVOCATION
部分找到man bash
。以下是相关摘录:
When bash is invoked as an interactive login shell, or as a non-inter-
active shell with the --login option, it first reads and executes com-
mands from the file /etc/profile, if that file exists. After reading
that file, it looks for ~/.bash_profile, ~/.bash_login, and ~/.profile,
in that order, and reads and executes commands from the first one that
exists and is readable. The --noprofile option may be used when the
shell is started to inhibit this behavior.
When a login shell exits, bash reads and executes commands from the
file ~/.bash_logout, if it exists.
When an interactive shell that is not a login shell is started, bash
reads and executes commands from ~/.bashrc, if that file exists. This
may be inhibited by using the --norc option. The --rcfile file option
will force bash to read and execute commands from file instead of
~/.bashrc.
When bash is started non-interactively, to run a shell script, for
example, it looks for the variable BASH_ENV in the environment, expands
its value if it appears there, and uses the expanded value as the name
of a file to read and execute. Bash behaves as if the following com-
mand were executed:
if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi
but the value of the PATH variable is not used to search for the file
name.
手册页中还有更多内容,我建议您阅读它。
答案2
事情比 shell 提供的要复杂一些。
登录方式主要有以下三种:
- 从真正的终端登录(现在主要是控制台)
- 从伪终端登录(主要是网络连接)
- 从图形环境登录
它们都能够在执行您的 shell 之前设置环境,并且它们都可以(HOME
、LOGNAME
、TERM
可能不是由您的 shell 设置的,即使您没有启动文件,您的 shell 通常也会继承PATH
环境变量)。
当从真实终端登录时,处理连接的进程可能会设置TERM
环境变量并将其余工作委托给程序login
。该程序会执行一些验证(例如防止 root 在不安全的终端上登录),确保整个环境TERM
是干净的,初始化HOME
, PATH
, SHELL
, TERM
, MAIL
,LOGNAME
然后启动您的登录 shell。然后您的 shell 将进行自己的初始化。
当从伪终端登录时,会发生同样的事情,但稍有不同。通常,环境从处理连接的进程中获得更多的初始化,而不仅仅是TERM
环境变量(网络协议通常有一种从另一端传输环境的方法),因此login
在不清理环境的模式下使用,清理工作是由处理连接的程序完成的。
图形环境通常不会委托,login
但行为类似。验证您的凭据后,他们会创建一个干净的环境(使用常用的环境变量,并且至少DISPLAY
设置正确;他们通常允许系统管理员提供的脚本添加内容),然后为您的桌面环境启动启动脚本;这些可能会尝试从您的登录 shell 获取环境,并且通常还提供提供脚本来完成设置的可能性。因此,当您从桌面启动任何程序时,其环境是图形登录程序、桌面环境和登录脚本设置的组合。
最后一件事:当您启动终端模拟器时,您可能会获得一个登录 shell(在这种情况下,会执行 shell 中的登录脚本,因此您可以看到其中最新更改的效果,但不会看到与其他程序相同的环境)或不同(在这种情况下,不执行 shell 中的登录脚本,您看不到最新的更改,但您获得与其他程序相同的环境 - 由交互式初始化修改shell 的脚本)。
答案3
检查/etc/bash*
/etc/profile*
文件。
答案4
检查 bash 的手册页,因为它应该根据您的发行版提供所有已检查的文件(以及按顺序)。该env
命令会告诉您设置的内容,但不会告诉您设置的位置。然而,快速的 grep 会告诉你这些设置在哪里。