在 vim 内采购 .bashrc 时 PATH 变量未更新
PATH variable not updating when sourcing .bashrc inside vim
在 vim 中获取 .bashrc 文件不会更新 PATH 变量。
场景是这样的:
- 我打开了两个终端。
- 我使用命令
echo "export PATH=$PATH:/home/xyz/abc/polyglot/bin" >> ~/.bashrc
在一个终端上将新的 PATH 导出到 .bashrc,然后关闭终端。
- 然后我从另一个终端的 vim 实例 运行
:! source ~/.bashrc
。它毫无怨言地来源。
- 然后我从 vim 中输入
! echo $PATH
。 PATH 变量未反映更新的更改。
如果我打开一个新终端并 echo $PATH
,它会显示更新后的值,这符合预期。但无论我在 vim 中获取 .bashrc 多少次,变量都不会更新。有人可以解释这种行为吗?
每次您从 vim
内部使用 :!
执行 shell 命令时,vim
会创建一个新的子 shell 环境。当命令完成时,subshell 终止并且它的所有环境都消失了。
因此,创建新的 shell 并在 shell 中设置 PATH
的次数并不重要;它只是用于执行 echo
的那个才算数,而在那一个中,您还没有找到您的个人资料。
最简单的解决方案是在 启动 vim
之前 获取您的配置文件,这样 vim
创建的子shell 将继承 $PATH
.
顺便说一句,.bashrc
一般只用于interactivebashshells,而shells vim
创建的不是交互式的。 vim
使用 bash -c
来调用 shell 并传递给它一个字符串来执行,尽管精确的调用是由 shell
和 shellcmdflag
变量控制的。特别是,如果您通过将 -l
添加到 shellcmdflag
中的选项来告诉 vim
创建登录名 shell,那么 bash shell将自动来源 ~/.bash_profile
(或 ~/.profile
如果 ~/.bash_profile
不存在);这通常是放置环境设置的更有用的地方。
关于您问题的根源,rici 所说的一切都是正确的。然而,解决办法其实很简单:如果你不能在调用Vim之前设置你的PATH,Vim让你直接编辑当前环境。
:let $PATH=$PATH.":/home/xyz/abc/polyglot/bin"
因此,如果您需要新路径,请将其写入 Vim 脚本文件并从那里获取源代码,而不是获取 .bashrc
.
在 vim 中获取 .bashrc 文件不会更新 PATH 变量。
场景是这样的:
- 我打开了两个终端。
- 我使用命令
echo "export PATH=$PATH:/home/xyz/abc/polyglot/bin" >> ~/.bashrc
在一个终端上将新的 PATH 导出到 .bashrc,然后关闭终端。 - 然后我从另一个终端的 vim 实例 运行
:! source ~/.bashrc
。它毫无怨言地来源。 - 然后我从 vim 中输入
! echo $PATH
。 PATH 变量未反映更新的更改。
如果我打开一个新终端并 echo $PATH
,它会显示更新后的值,这符合预期。但无论我在 vim 中获取 .bashrc 多少次,变量都不会更新。有人可以解释这种行为吗?
每次您从 vim
内部使用 :!
执行 shell 命令时,vim
会创建一个新的子 shell 环境。当命令完成时,subshell 终止并且它的所有环境都消失了。
因此,创建新的 shell 并在 shell 中设置 PATH
的次数并不重要;它只是用于执行 echo
的那个才算数,而在那一个中,您还没有找到您的个人资料。
最简单的解决方案是在 启动 vim
之前 获取您的配置文件,这样 vim
创建的子shell 将继承 $PATH
.
顺便说一句,.bashrc
一般只用于interactivebashshells,而shells vim
创建的不是交互式的。 vim
使用 bash -c
来调用 shell 并传递给它一个字符串来执行,尽管精确的调用是由 shell
和 shellcmdflag
变量控制的。特别是,如果您通过将 -l
添加到 shellcmdflag
中的选项来告诉 vim
创建登录名 shell,那么 bash shell将自动来源 ~/.bash_profile
(或 ~/.profile
如果 ~/.bash_profile
不存在);这通常是放置环境设置的更有用的地方。
关于您问题的根源,rici 所说的一切都是正确的。然而,解决办法其实很简单:如果你不能在调用Vim之前设置你的PATH,Vim让你直接编辑当前环境。
:let $PATH=$PATH.":/home/xyz/abc/polyglot/bin"
因此,如果您需要新路径,请将其写入 Vim 脚本文件并从那里获取源代码,而不是获取 .bashrc
.