有没有办法找出 bash 来源的所有文件?
或者,是否有一个单一入口点(或第一个入口点),我可以通过在顶部添加
set -x
来跟踪并查找此信息?
(通过单点入口,我并不是指 ~/.bashrc 或 ~/.bash_profile,因为源链中较高的其他一些文件告诉 bash 首先加载上述文件)。
重新提出这个问题,因为有一个自动化的解决方案:
执行 bash 并将其从输出中提取出来。
-li
是交互式登录,-x
打印出bash内部正在做什么,-c exit
只是告诉bash立即终止。使用 sed
过滤掉 source
命令或 .
别名。
/bin/bash -lixc exit 2>&1 | sed -n 's/^+* \(source\|\.\) //p'
这里没有简单的包罗万象的答案,这取决于登录/交互属性的组合。
登录 shell 将获取
/etc/profile
,并且仅在 ~/.bash_profile
、~/.bash_login
和 ~/.profile
中找到第一个。您可以将这些独立的入口点称为:/etc/profile
不需要显式地获取其他入口之一,是 bash
来实现这一点。
对于非登录交互,您有
/etc/bash.bashrc
和 ~/.bashrc
,同样是独立的。
对于非登录非交互式,单点入口是
$BASH_ENV
(如果已定义)。
您可以在 GNU Bash 手册的Bash 启动文件下找到官方说明。
加载所有启动文件的进程有几个地方启动。
此链接中的表格将清楚地说明:
Interactive login /etc/profile
Interactive non-login /etc/bash.bashrc
Script $BASH_ENV
将
login
理解为交互式登录或使用选项 --login 调用的非交互式 shell。来自man bash
:
当 bash 作为交互式登录 shell 或带有
选项的非交互式 shell 被调用时,它首先从文件--login
中读取并执行命令(如果该文件存在)。/etc/profile
但是,对交互式 shell 最常见的调用是
su - $USER
,它使用 -
作为所调用命令的第一个字符(而不是 --login
)。
这是默认设置。 没有什么可以阻止您编辑这些文件并在 /etc/profile 中添加如下内容:
if [ -f /etc/bash.bashrc ]; then
source /etc/bash.bashrc
fi
这将确保在所有
/etc/bash.bashrc
贝壳情况下都采购 Interactive
。
应注意避免重复的变量或操作(源自两个文件)。定义一个变量并在执行某些操作之前检查它是否已设置将使此过程更加可靠。
从 bash 的角度来看,脚本的起点是变量
$BASH_ENV
,必须在调用 bash 之前之前在环境中设置该变量。这将搜索扩展到可能调用 bash 的其他 shell 或程序。在这种情况下,没有单一确定的解决方案,只有通常的做法。
通常的做法是不使用 $BASH_ENV,因此 bash 将仅以所有编译选项启动。
/bin/bash -lixc exit 2>&1 | sed -nE 's/^\+* (source|\.) //p'
此软件适用于 Linux 和 macOS。将 -E
标志传递给 sed 允许使用扩展(现代)正则表达式而不是基本正则表达式。 macOS 的 sed 显然不支持正则表达式中的更改 (
|
)。如果您想了解更多信息,请查看
re_syntax
(适用于 Linux)或
re_format
(适用于 macOS)手册页。
作为奖励这里有同样的事情,但是对于zsh
:
/bin/zsh -lixc exit 2>&1 | sed -nE 's/^\+.*> (source|\.) //p'