文档概览

文档概览

我发现系统上有以下文件。需要了解所有环境文件在不同场景下运行的情况。

/etc/profile
$HOME/.bashrc
$HOME/.bash_profile
$HOME/.profile
  1. 当我们通过 putty 登录到服务器时
  2. 当我们运行 bash 命令来创建子 shell 时
  3. 当我们通过 crontab 运行脚本时
  4. 当我们用“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在任何点文件之前处理,并且与它们是否存在无关。

有关更多信息,B​​ash 的启动过程在 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

相关内容