如何获取由bash提供的所有文件的列表?

时间:2016-08-19 00:38:20

标签: bash shell

有没有办法找出bash来源的所有文件?

或者,是否有单一的入口点(或第一个入口点)我可以通过在顶部添加set -x来关注并查找此信息?

(单点输入,我的意思不是〜/ .bashrc或〜/ .bash_profile,因为源链中较高的其他文件告诉bash首先加载这些上面的文件。)

3 个答案:

答案 0 :(得分:3)

这里没有简单的全能答案,这取决于登录/交互属性的组合。

登录shell会在/etc/profile~/.bash_profile~/.bash_login之间找到~/.profile来源的第一个来源。您可以调用这些独立的入口点:/etc/profile不需要明确地提供其他人之一,而bash就是这样做的。

对于非登录互动,您可以再次独立/etc/bash.bashrc~/.bashrc

对于非登录非交互式,单一入口点为$BASH_ENV,如果已定义。

您可以在Bash startup files下的GNU Bash手册中找到官方说明。

答案 1 :(得分:3)

有几个地方可以开始加载所有启动文件的过程。

here会说清楚:

Interactive login          /etc/profile
Interactive non-login      /etc/bash.bashrc
Script                     $BASH_ENV

login理解为使用选项--login调用的交互式登录或非交互式shell。来自man bash

  

当bash作为交互式登录shell或作为具有--login选项的非交互式shell调用时,它首先从文件/etc/profile读取并执行命令(如果该文件存在)。 / p>

但是,对交互式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只会从所有编译选项开始。

答案 2 :(得分:3)

重新提出这个问题,因为有一个自动化:

执行 bash 并将其从输出中剔除。 -li 是交互式登录,-x 打印出 bash 内部正在做什么,而 -c exit 只是告诉 bash 立即终止。使用 sed 过滤掉 source 命令。

/bin/bash -lixc exit 2>&1 | sed -n 's/^+* source //p'