![bashrc 命令应该支持 shell 重新加载吗?](https://linux22.com/image/180152/bashrc%20%E5%91%BD%E4%BB%A4%E5%BA%94%E8%AF%A5%E6%94%AF%E6%8C%81%20shell%20%E9%87%8D%E6%96%B0%E5%8A%A0%E8%BD%BD%E5%90%97%EF%BC%9F.png)
每当用户重新加载 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 取消了该功能,因此请将其复制到您自己的配置文件中。