bashrc 命令应该支持 shell 重新加载吗?

bashrc 命令应该支持 shell 重新加载吗?

每当用户重新加载 shell 而不打开新终端时,exec $SHELL文件bashrc就会再次执行。

问题是:

打算在 shell 启动时运行的命令是否应该明确支持此操作?

当然,shell 函数无法在 shell 进程替换后继续存在,但环境变量却可以。因此,通常的副作用是PATH多次添加东西。

为了保持客观,我主要感兴趣的是是否有任何关于此的官方指南。

答案1

.bashrc文件旨在容纳您的物品每次启动新的交互式 shell 时执行。这不是设置PATH变量的正确位置,例如,您应该只包含在每个 shell 初始化时需要运行的内容。

这就是为什么我们有两个 bash 配置文件“系列”:

  • /etc/bashrc~/.bashrc每次读取新的 交互式外壳那是不是登录 shell已开始。

  • /etc/profile每次启动新的交互式登录 shell 时都会获取、~/.bash_profile~/.bash_login和(按该顺序)。~/.profile

在实践中,对于大多数系统来说,这意味着~/.profile当您登录时,该组文件将被读取一次,然后~/.bashrc每次打开新终端或启动新的交互式 shell 时都会读取这些文件。

因此,如果您发现每次启动新 shell 时都执行了某些内容~/.bashrc并导致出现问题,则意味着您的系统配置错误并且您正在~/.bashrc使用应该使用~/.bash_profile~/.profile。换句话说,是的,.bashrc绝对应该在每次启动新的交互式非登录 shell 时执行。

答案2

您可以使用此功能,可在 /etc/profile 中找到

pathmunge () {
    case ":${PATH}:" in
        *:"$1":*)
            ;;
        *)
            [ ! -d "$1" ] && return
            if [ "$2" = "after" ] ; then
                PATH=$PATH:$1
            else
                PATH=$1:$PATH
            fi
    esac
}

在添加目录之前,它会检测目录是否已在 PATH 中。

在 ~/.profile 或 ~/.bash_profile 中使用它:

path_munge /directory/to/add before
# or
path_munge /directory/to/add/also after

将所需的目录添加到 PATH 中。

请注意,/etc/profile 取消了该功能,因此请将其复制到您自己的配置文件中。

相关内容