本文解决以下问题:
- ubuntu配置在系统脚本~/.bash_profile里的环境变量为什么重开terminal后又不生效了?
- 如何为当前用户永久修改
PATH环境变量? - bash默认的启动脚本到底是哪个文件?
~/.bashrc、~/.bash_profile、~/.profile还是~/.bash_login? - 什么是
login shell?什么又是非login shell?
前言
起因是为了方便使用Netronome SDK相关的命令,需要为PATH环境变量添加程序所在路径:
# Netronome SDK
PATH=$PATH:/opt/netronome/bin:/opt/netronome/p4/bin
export PATH
但是这是临时设置的变量,重启或者开启其他terminal就会失效,于是寻求一种永久修改PATH环境变量的方法,也就是把这两句命令写到bash默认的启动脚本里边,每次启动新的terminal都会执行一遍的那种;
结果一查,有~/.bashrc、~/.bash_profile、~/.profile、~/.bash_login这么些脚本……我到底该加到哪里?
查询中就有了以下问题:
- bash默认的启动脚本到底是哪个文件?
~/.bashrc、~/.bash_profile、~/.profile还是~/.bash_login?更确切来说,我上面那段想加到用户bash启动时执行的脚本应该放在哪个文件? - 什么是
login shell?什么又是非login shell?具体来说,我通过ssh远程连接的shell和Ubuntu桌面版Ctrl + Alt + T打开的shell有什么区别?
有些博客内容真的很让人糟心,只给一个结论就算了结论还不太对。
我可以保证我的结论是有调研和测试过的,可以回答以上两个问题,放心食用。
但需要注意的是:不同linux发行版对应的文件名可能不太一样,本文在Ubuntu 18下测试的
结论
还是一样,先说结论:
我这种Ubuntu 18的系统,都放到~/.bashrc里边就好,保证能执行到,就是不知道这样是否规范。
原因
我们首先得知道什么是login shell和非login shell;
-
login shell可以理解为需要你登录(login)的shell,需要输入用户名、输入密码(软件帮你存储好的也算),比如ssh远程登录; -
非login shell则相反,是无需登录,而由某些程序启动的shell,比如你通过su切换的shell、桌面版ubuntu打开的shell(可以理解为你已经登录的用户打开的shell);
区分两者的一个办法(来自sky凌乱的微笑,sky老师的博客)是在该shell下执行echo $0,如果得到的有-前缀则是login shell,反之不是。

注:su 可以用
-l参数使切换为login shell,否则默认是非login shell
脚本执行顺序
-
对于
login shell来说,会依次查询用户目录下的以下文件~/.bash_profile、~/.bash_login、~/.profile是否存在,找到了一个脚本就不会再执行后面的配置脚本。 -
对于
非login shell,则只会按照~/.bashrc执行。
执行顺序可以通过在以上文件中加入echo进行测试。
注:至少是Ubuntu18下,login shell默认只有
~/.profile一个配置文件,而且在文件里面默认包含了~/.bashrc:[...] # if running bash, 即if "$BASH_VERSION"不为空 if [ -n "$BASH_VERSION" ]; then # include .bashrc if it exists if [ -f "$HOME/.bashrc" ]; then . "$HOME/.bashrc" fi fi
所以说,我的Ubuntu 18不管是login shell还是非login shell,都会执行一次~/.bashrc脚本,所以放里边就好。至于其他情况,就参考以上执行顺序,自行判断应该放到哪个文件里吧。
注:需要注意的是这种方法是只对当前用户有效,虽然我要的就是这效果吧。如果想对所有用户生效,需要修改
/etc/profile,但是/etc/profile我测试也是只对login shell有效;就不多说了。
结语
以上。
简单整理测试,有问题还请补充指出,有帮到的话请留下三连,多谢!
本文详细解释了如何在Ubuntu 18系统中将环境变量永久添加到~/.bashrc中,区分了loginshell和非loginshell的区别,并指导了在不同类型的shell脚本中正确放置配置。

2447

被折叠的 条评论
为什么被折叠?



