11月28, 2019

VSCode Remote环境变量加载——续

上次我们提到了VSCode Remote的环境变量加载是在第一次远程服务器启动Remote Server(node启动)时。如果修改了环境变量想要重新加载,需要重新开启VSCode Remote的远程服务。

但是我后来遇到了一个问题,VSCode Remote始终没有加载我在.bashrc里添加的环境变量,但是在VSCode中打开的终端的环境变量却没有问题,这是为什么呢?

经过一番研究,终于发现,问题的根源在于VSCode Remote在登录远程服务器时,使用的是Interactive login的方式,这种方式会加载/etc/profile~/.bash_profile / ~/.bash_login / ~/.profile,默认并不会加载~/.bashrc,因此我们在~/.bashrc中设置的环境变量也就不会在VSCode Remote中生效了。不过VSCode中打开终端时使用的是Interactive non-login方式,就会读取~/.bashrc,且在登录终端之前会将VSCode Remote启动时的环境变量继承到终端中。

再来说回我们遇到的问题,通常来说,用户目录下的~/.profile文件中会有执行~/.bashrc文件的语句,这是也我之前从来没注意这个问题但是也可以正常使用的原因。但是公司新的海外开发机并没有从/etc/skel目录复制.bash_logout.bashrc.profile等三个文件,于是我自己创建了个.bashrc写一些环境变量,但由于没有~/.profile帮我执行~/.bashrc,环境变量自然也就不生效了。

另外,由于默认的~/.profile文件会执行~/.bashrc,且VSCode在打开终端时会将之前的环境变量继承,则在打开终端时会发现所有以“添加”形式设置的环境变量里面的内容会出现两次。

PS: 我是在配Go环境的时候遇到的这个问题,VSCode报错:

Failed to run "go env" to find GOPATH as the "go" binary cannot be found in either GOROOT(xxxxx) or PATH(/home/fz/.vscode-server/bin/f359dd69833dd8800b54d458f6d37ab7c78dfxxx/bin......)

附:

环境变量加载顺序:

https://shreevatsa.wordpress.com/2008/03/30/zshbash-startup-files-loading-order-bashrc-zshrc-etc/

+----------------+-----------+-----------+------+
|                |Interactive|Interactive|Script|
|                |login      |non-login  |      |
+----------------+-----------+-----------+------+
|/etc/profile    |   A       |           |      |
+----------------+-----------+-----------+------+
|/etc/bash.bashrc|           |    A      |      |
+----------------+-----------+-----------+------+
|~/.bashrc       |           |    B      |      |
+----------------+-----------+-----------+------+
|~/.bash_profile |   B1      |           |      |
+----------------+-----------+-----------+------+
|~/.bash_login   |   B2      |           |      |
+----------------+-----------+-----------+------+
|~/.profile      |   B3      |           |      |
+----------------+-----------+-----------+------+
|BASH_ENV        |           |           |  A   |
+----------------+-----------+-----------+------+
|                |           |           |      |
+----------------+-----------+-----------+------+
|                |           |           |      |
+----------------+-----------+-----------+------+
|~/.bash_logout  |    C      |           |      |
+----------------+-----------+-----------+------+

image.png

shell登录方式的区别:

https://unix.stackexchange.com/questions/50665/what-is-the-difference-between-interactive-shells-login-shells-non-login-shell

VSCode Remote对环境变量加载的一些解释:

https://github.com/microsoft/vscode-remote-release/issues/83

本文链接:https://debug.fanzheng.org/post/vscode-remote-env-loading-sequel.html

-- EOF --

Comments

评论加载中...

注:如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理。