![RedHat 下的 bash 中的 shell 变量来源在哪里?](https://linux22.com/image/1308926/RedHat%20%E4%B8%8B%E7%9A%84%20bash%20%E4%B8%AD%E7%9A%84%20shell%20%E5%8F%98%E9%87%8F%E6%9D%A5%E6%BA%90%E5%9C%A8%E5%93%AA%E9%87%8C%EF%BC%9F.png)
我在我的环境中发现了一些奇怪的事情。
我有一个.bash_profile
只检查.bashrc
然后获取它的文件。我JAVA_HOME
在该文件中有一个可以正确设置变量并导出它。但是,如果我注释掉JAVA_HOME
中的行.bashrc
,另一个JAVA_HOME
仍会显示在我的环境中,与我在 中设置的行不同.bashrc
。这个另一个JAVA_HOME
来自哪里?
此外,似乎我运行的任何 shell(csh、sh、bash 等)都会JAVA_HOME
从某个地方拉入。我不知道是什么导致它进入 csh、sh、bash 等……
答案1
/etc/profile
是最常见的
答案2
Bash 遵循 Posix 约定,在启动时首先通过获取 /etc/profile 文件来设置您的 shell 上下文。在 RedHat 系统上,/etc/profile 文件包含代码,用于在 /etc/profile.d 中查找以“.sh”结尾的文件。然后,它会逐个获取这些文件,并将其中设置的变量添加到您的环境中。
同样,csh/tcsh shell 运行 /etc/csh.login,它会在同一个 /etc/profile.d 目录中查找以 '.csh' 结尾的文件并对它们进行相同的查找。
尝试运行:
$ fgrep JAVA_HOME /etc/profile.d/*.sh
您可能会找到罪魁祸首。您可以用 sudo 编辑该文件并在其中设置适当的值,尽管这会对所有登录到系统的人进行全局更改,因此在执行此操作之前请仔细考虑。
这些文件的目的是允许单独的软件包添加与用户环境相关的环境设置,而无需编辑全局 /etc/profile 文件。软件包通常将文件以 .sh 和 .csh 的形式放置在其中,并且通常具有相同的功能内容。