我有一个脚本,它在我的底部插入一些行.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”。