/etc/profile 和 /etc/bashrc 的区别 (转载)
转自https://mp.weixin.qq.com/s/vBJjHVOkGAfuEgRol99pLQ?mpshare1scene1srcid04150QRllTxCKGn8N6MIPtzksharer_shareinfo8d5a74fc26448a2a41078b2321e16595sharer_shareinfo_first8d5a74fc26448a2a41078b2321e16595color_schemelight#rd有没有遇到过这种烦恼明明改了环境变量重启系统后配置却纹丝不动或者辛苦添加了别名和函数新打开的终端窗口里死活找不到这些问题十有八九源于对/etc/profile和/etc/bashrc这两个配置文件的理解偏差。要想真正玩转 Linux 系统配置必须搞清楚这两个文件各自的作用和加载时机。Shell 的两种运行方式Linux 中的 shell 分为两种模式登录式 shell和非登录式 shell。这两种模式决定了系统会读取哪些配置文件。典型的需要登录式 shell的场景有- 通过 SSH 输入用户名密码远程登录- 物理登录系统控制台- 运行bash --login命令常见的非登录式 shell包括- 在已经登录的 shell 里执行 bash 命令-打开图形界面里的新终端窗口配置文件加载顺序登录式 shell会按以下顺序读取配置文件/etc/profile → ~/.bash_profile → ~/.bash_login → ~/.profile → ~/.bash_logout非登录式 shell 的加载顺序则简单得多/etc/bash.bashrc → ~/.bashrc仔细看几个关键文件的内容就能发现其中的依赖关系1./etc/profile会执行/etc/profile.d目录下所有的 .sh 文件for i in /etc/profile.d/*.sh; do if [ -r $i ]; then . $i fi done来个我的demo#! /bin/bash #for i /home/hzs/rockchip-sdk/patch/bin/a/bin/0418/*.sh; do for i in /home/hzs/rockchip-sdk/patch/bin/a/bin/0418/*.sh; do #if [ -r $i ]; if [ -r $i ]; then echo i: $i #./$i #.$i if [ $i ~ run ]; then . $i fi fi done #./run.sh: line 3: syntax error near unexpected token /home/hzs/rockchip-sdk/patch/bin/a/bin/0418/*.sh #./run.sh: line 3: for i /home/hzs/rockchip-sdk/patch/bin/a/bin/0418/*.sh; do距离还差很远呀语法一堆的错2. 很多系统的~/.bash_profile会主动调用~/.bashrcif [ -f ~/.bashrc ]; then . ~/.bashrc fi3.~/.bashrc文件又通常会引入/etc/bashrcif [ -f /etc/bashrc ]; then . /etc/bashrc fi怎么配置最顺手关于环境变量和别名的设置业内有一些公认的做法• 像 PATH 这类环境变量最好放在~/.bash_profile里。因为交互式登录 shell 是系统里第一个启动的 shell把默认环境设置集中在这儿比较合理• 别名和函数更适合放在~/.bashrc中这样每次从现有环境启动 shell 时都能加载它们最简单的做法其实是把所有自定义配置都塞进~/.bashrc然后让~/.bash_profile去引用它。这样一来别名、PATH 和环境变量在每个交互式 shell 里都能用上。如果想确认当前 shell 是不是登录式可以试试这个命令shopt login_shell看到 login_shell on 表示这是登录式 shelllogin_shell off 则是非登录式。几个常见坑和填坑方法环境变量改了怎么没生效如果你把 PATH 环境变量的修改写在了~/.bashrc里但 SSH 登录时就是没生效那很可能是因为 SSH 登录启动的是登录式 shell读取的是~/.bash_profile。解决办法有两个要么在~/.bash_profile里引用~/.bashrc要么直接把环境变量放进~/.bash_profile。为什么新开的终端窗口找不到别名如果你把定义的别名放在了~/.bash_profile里新打开的终端窗口却找不到它那是因为新窗口属于非登录式 shell它只读取~/.bashrc。解决起来很简单把别名移到~/.bashrc里就行了。系统级配置该放哪儿如果想给所有用户设置环境变量应该放在/etc/profile或者/etc/profile.d目录下的脚本里。要是想为所有用户设置别名或函数那就应该放在/etc/bashrc里。把这些配置文件的加载顺序搞清楚了能省去不少配置上的麻烦。我平时习惯把系统级的配置放到/etc/profile.d目录下这样既能保持配置文件整洁也方便按应用来管理。个人配置我遵循“bashrc 放别名、profile 放环境变量”的原则让每个文件各司其职配置起来也心里有数。你平时是怎么管理配置文件的有什么特别的技巧或经验想和大家分享