我发现系统上有以下文件。需要了解所有环境文件在不同场景下运行的情况。
/etc/profile
$HOME/.bashrc
$HOME/.bash_profile
$HOME/.profile
- 当我们通过 putty 登录到服务器时
- 当我们运行 bash 命令来创建子 shell 时
- 当我们通过 crontab 运行脚本时
- 当我们用“sh script.sh”命令在shell中运行脚本时。
答案1
文档概览
要回答这个问题,请查阅man bash
并跳到以下FILES
部分:
/etc/profile
为登录 shell 执行的系统范围初始化文件
/etc/bash.bashrc
系统范围的每个交互式 shell 启动文件
/etc/bash.bash.logout
系统范围的登录 shell 清理文件,在登录 shell 退出时执行
~/.bash_profile
为登录 shell 执行的个人初始化文件
~/.bashrc
每个交互式 shell 的单独启动文件
~/.bash_logout
单独的登录 shell 清理文件,在登录 shell 退出时执行
不在 FILES 部分,但也在手册页中.profile
。基本上,Bash 会优先考虑.bash_profile
它是否存在。相反:/etc/profile
在任何点文件之前处理,并且与它们是否存在无关。
有关更多信息,Bash 的启动过程在 Bash 手册页的 INVOCATION 下进行了说明。
将其应用于场景
当我们通过 putty 登录到服务器时
这应该被视为(但可能是可配置的?)“登录”。因此/etc/profile
将运行,然后~/.bash_profile
如果它存在。如果不存在,~/.profile
将运行(如果存在)。
当我们运行 bash 命令来创建子 shell 时
取决于这到底意味着什么,是否有任何命令行显示您所说的子 shell 的意思?正常(
和)
在 shell 脚本中不会触发任何文件,但交互式bash
将运行.bashrc
。
当我们通过 crontab 运行脚本时
与下一个问题类似。请注意,在这种情况下,不会定义提示,这会导致大多数 bashrc 文件立即返回(即使它们已加载)。与从命令行进行的“交互式”脚本调用相比,这可能会导致通过 crontab 运行的脚本中缺少某些环境变量。
当我们用“sh script.sh”命令在shell中运行脚本时。
这实际上取决于发行版。在基于 Debian 的系统上,sh
=/usr/bin/dash
表示不会考虑列表中的任何文件。调用man dash
(并查看 FILES 部分)了解详细信息。
在基于 CentOS 的系统上,sh
=将按顺序/bin/bash
查阅/etc/profile
和(如果不存在则跳过)。~/.profile