Ubuntu SSH 环境下如何自定义 PATH 等变量

今天在设置一台 Server 的时候,又因为一个老问题卡了一下。解决后想:当时要是写了文章就好了…于是为了不发生第三次这样的事情,我写了这篇文章。

这个问题就是 SSH 环境下的 Path 环境变量。在 Server 上,为了使用最新版本的 Python,我是使用 pyenv 在自己的 HOME 安装了一个 Python 3.6.5。pyenv 是用于管理 Python 版本的一个组件,非常好用。它通过在 ~/.bashrc 下写入了如下配置,可以非常灵活地使用和切换任意版本的 Python。

export PATH="/home/tualatrix/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

有时候我会在本地电脑通过脚本远程管理 Server,有时用到了 Python 写的工具。这次新设置了一台 Server 后,发现 SSH 怎么也调用不了我想要调用的工具,一直显示:command not found。

我印象中 Ubuntu 的 SSH 的非交互式会话(non-interactive)是会去读 ~/.bashrc 的,既然会去读,PATH 也应该设置成功,应该能调用成功命令行才对。我反复确认、测试,都无效,只好启用了 StackoverFlow 大法。终于找到了原因:

Ubuntu 的 .bashrc 在开头会检测是不是非交互式(non-interactive),如果是的话,哼哼,直接 return 掉,所以后面的内容都不会被执行。

这段在开头的代码就是元凶:

# If not running interactively, don't do anything
case $- in
        *i*) ;;
            *) return;;
esac

知道原因了以后就好办了,把 PATH 的相关设置,挪到这段代码前即可。至于 Ubuntu 为啥搞这么一个 return,我想是因为 .bashrc 后面的一些设置,PS1 之类的,并不适用于非交互式的环境,所以才需要 return 掉吧。

PS:今天还遇到一个 SSH 的问题,那就是莫名的连接缓慢,后来我换了一个端口,问题解决🤔

PS2:推友 @cal_tse 补充了一个新办法,那就是单独写进 ~/.ssh/environment,也不错~

欢迎使用图拉鼎开发的产品

Manico - 快速启动和切换 App

高效率 App 启动与切换工具,使用它将加倍电脑日常使用的效率,免费下载体验。

3 Comments

如果非交互式shell也读bashrc的话,很多进程的启动会变慢。尤其是在bashrc写了很多读,很多插件的。

http://www.joshstaiger.org/archives/2005/07/bash_profile_vs.html

plantegg

https://plantegg.github.io/2018/03/24/Linux%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F/ 这里把这种问题总结得比较全面了

Leave a Comment