更新 `.bashrc` 并重新加载

更新 `.bashrc` 并重新加载

我有一个脚本,它在我的底部插入一些行.bashrc,有没有办法.bashrc从脚本中获取这些行,以便在脚本完成后保留这些更改?这是类似脚本的 MWE:

#!/bin/bash

echo "export MyDir='MyAnalysis'" >> ~/.bashrc
echo "alias llA='ll MyAnalysis'" >> ~/.bashrc

source ~/.bashrc

运行脚本后,除非手动获取文件,否则MyDir都不llA可用.bashrc

答案1

不直接。

您的脚本在与交互式 shell 不同的进程中运行。当脚本的 shell 退出时,该脚本的 shell 对环境所做的任何更改都将消失。子进程不允许改变父进程的环境。

你可以做的事情:

  • 该脚本更新您的 .bashrc 且不执行任何其他操作:如果脚本成功完成,您将获取 bashrc

    bash yourScript.bash && source .bashrc
    
  • 该脚本更新 .bashrc,并且印刷source 命令:确保它不打印任何其他内容。然后你eval执行脚本。

    eval "$(bash yourScript.bash)"
    
  • 该脚本更新 .bashrc 和打印它的作用。你评估它:这是脚本

    #!/bin/bash
    exec > >(tee -a "$HOME/.bashrc")
    
    echo "export MyDir='MyAnalysis'"
    echo "alias llA='ll MyAnalysis'"
    

    然后你像运行它一样

    eval "$(bash yourScript.bash)"
    
  • 不要更新家长shell,但启动一个新的交互式 shell 来读取 bashrc

    #!/bin/bash
    {
        echo "export MyDir='MyAnalysis'"
        echo "alias llA='ll MyAnalysis'"
    } >> ~/.bashrc
    exec bash -i
    

    父 shell 未更新。


如果您将 .bashrc 更新代码设为功能,它将按预期工作,因为函数在当前 shell 中运行(默认情况下):

addMyAnalysis() {
    echo "export MyDir='MyAnalysis'" >> ~/.bashrc
    echo "alias llA='ll MyAnalysis'" >> ~/.bashrc
    source ~/.bashrc
}

另一种技术:创建一个“conf”目录$HOME/.bash.d。在里面写入bash文件

# this is "~/.bash.d/some_file.bash"
export MyDir='MyAnalysis'
alias llA='ll MyAnalysis'

并且你的 .bashrc 引用该目录下的任何 bash 文件:

if [[ -d ~/.bash.d ]]; then
    shopt -s nullglob
    for f in ~/.bash.d/*.bash; do
        source "$f"
    done
    shopt -u nullglob
fi

答案2

正如 @glenn-jackman 所指出的,您的采购发生在执行脚本的子 shell 中,并且在脚本结束时您返回到没有发生采购的父 shell,并且 .bashrc 也不会重新执行 - 这种分离父 shell 和子 shell 源于一般安全考虑。

您正在寻找的是exec bash,但不在您的脚本内,而是与其分组,即

bash your-script.sh && exec bash

这表现仿佛您将进行采购,然后留在您采购的外壳中。确实如此取代当前的 shell 带有一个新的 shell,这个新的 shell 与每个(交互式)shell 一样启动,运行您的 .bashrc,现在进行您的更改,您启动的每个新 shell/终端也是如此。

请注意,如果您在脚本中“exec bash”,它将替换脚本运行的子 shell,但仍然是子 shell。

如果您的目标是对 .bashrc 进行动态和临时操作,您应该考虑 @glenn-jackman 的建议,即在单独的文件中进行更改,这些文件可以在您选择的任何时候轻松删除。为此,您也可以拥有一条永久线路

[ -f ~/.bashrc-temporary-addons ] && source ~/.bashrc-temporary-addons

在 .bashrc 的末尾,然后执行 (! only第一行中的“">”有一个新文件)

echo "" > ~/.bashrc-temporary-addons
echo "export MyDir='MyAnalysis'" >> ~/.bashrc-temporary-addons
echo "alias llA='ll MyAnalysis'" >> ~/.bashrc-temporary-addons

并且,在您选择的某个点上,只需

rm ~/.bashrc-temporary-addons

(由于“-f”测试,如果“~/.bashrc-temporary-addons”不存在,则不会出现错误)。

如果您的 .bashrc 操作应该与您的会话一样长,即直到注销(但不会在下次登录时重新出现),那么您可以创建一个.bash_logout文件来删除“bash.d/”中的临时文件或“bash.d/”中的所有内容。 d/”或“~/.bashrc-temporary-addons”。

相关内容