本文解决以下问题:
- ubuntu配置在系统脚本~/.bash_profile里的环境变量为什么又不生效了?
- 什么是
login shell ?什么又是非login shell ?
前言
起因是为了方便root敲Netronome SDK相关的命令,就想在bash启动脚本里面加上如下内容:
PATH=$PATH:/opt/netronome/bin:/opt/netronome/p4/bin
export PATH
查完发现应该是要加到~/.bash_profile 里面,我的目录下并没有这个文件,加了以后发现还是没有生效,只能source ~/.bash_profile ,而且每次切换到该用户都得重新通过source 启用;搜索过程就发现这么几个把我绕晕了的问题,今天来好好解决一下:
- bash默认的用户个性化脚本到底是哪个文件?
~/.bashrc 、~/.bash_profile 、~/.profile 还是~/.bash_login ?更确切来说,我上面那段想加到用户bash启动时执行的脚本应该放在哪个文件? - 什么是
login shell ?什么又是非login shell ?具体来说,我通过ssh远程连接的shell和图形化界面打开的shell有什么区别?
有些博客内容真的很让人糟心,只给一个结论就算了结论还不太对。
我可以保证我的结论是有调研和测试过的,可以回答以上两个问题,放心食用。
但需要注意的是:不同linux发行版对应的文件名可能不太一样,本文在Ubuntu 18下测试
结论
还是一样,先说结论:
-
login shell 可以理解为需要你登录的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 ,可以自行查看。
我得到的结论是,这种命令还是放在~/.profile 下吧,然后每次通过su切换的时候加上-l 参数变为login shell ,以保证不管是ssh还是su -l切换到该用户,配置脚本正确执行,也就能正确加载我们的$PATH环境变量。
结语
以上。
简单整理记录了一下,可能还不是很完备,有问题请指出,多谢!
|