.bashrc与.bash_profile的区别

时间:2020-01-09 10:37:28  来源:igfitidea点击:

我们有不同的配置文件,这些文件用于设置系统范围的配置。
但是我们总是需要设置用户特定的自定义设置,例如umask,别名,PATH变量等。
在这种情况下,我们可以使用这些用户特定的配置文件,例如.bashrc.bash_profile

"但是我们应该选择哪个文件。
"

bash启动文件列表

在继续学习.bashrc和.bash_profile之间的区别之前,让我列出大多数Linux发行版中存在的不同bash配置文件。

文件描述
/etc/profile这是在登录期间执行的系统范围的初始化文件。
它通常包含环境变量,包括初始路径和启动程序。
/etc/bashrc这是另一个系统范围的初始化文件,可以由用户的.bashrc为每个启动的bash shell执行。它通常包含函数和别名。
~/.bash如果此文件存在,则在登录时会在/etc/profile之后自动执行
~/.bash_login如果.bash_配置文件不存在,则在登录期间自动执行此文件
~/.profile如果.bash_profile和.bash_login都不存在,则在登录期间会自动执行此文件。这是基于Debian的发行版(如Ubuntu)的默认设置。请注意,这是原始的Bourne shell配置文件
~/.bashrc此文件在非交互式bash shell启动时执行,即X中的新终端窗口。此文件通常在bash交互式脚本(如~/.bash
~/.bash注销时自动执行此文件

.bashrc和.bash_profile

  • 首先要了解的是,rc文件适用于所有shell程序调用,而profiles则仅适用于交互式shell程序。

  • 交互式shell程序是我们(最终用户)其中键入命令的地方,而非交互式shell程序是在其他程序(例如,以#!/bin/bash为SHEBANG值的脚本)启动shell程序时输入的命令

  • 默认情况下,~~ .bashrc作为~~ .bash_profile的一部分执行,以加载别名功能

  • 现在,如果我在~/.bash_profile中注释掉执行.bashrc的部分,让我们检查一下结果:

接下来,我将在~~ .bashrc中添加一个echo语句。

现在,让我们验证不同的情况,并检查是否执行了.bashrc,应该在STDOUT上打印HELLO。

打开了一个重复的shell(未执行.bashrc)。
如果我们已经登录并且只是打开一个新的终端:

login as: root
[email protected]'s password:
Last login: Fri Sep  4 10:35:47 2017
[root@server ~]#

"使用控制台登录(未执行.bashrc)"以下是我的控制台中的代码段

使用切换用户(未执行.bashrc)

[hynman@server ~]$su - root
Password:
Last login: Fri Sep  4 10:42:00 IST 2017 on tty1
[root@server ~]#

从另一个服务器通过SSH登录(未执行.bashrc)在此示例中,我将使用一些外部节点登录到该服务器,以检查是否执行了.bashrc:

[root@ext ~]# ssh 192.168.43.10
[email protected]'s password:
Last login: Fri Sep  4 10:48:44 2017
[root@server ~]#

使用bash启动新实例(已执行.bashrc)当我们通过在shell上键入bash来启动新shell时

[root@server ~]# bash
HELLO

现在,我们看到屏幕上已打印出" HELLO",因此已执行了.bashrc

  • 如果我们扭转这种情况,即在~~ .bash_profile中添加echo HELLO而不是~/.bashrc中添加echo,那么我们得到的结果恰恰相反。

  • 因此,当我们通过SSH,通过重复的控制台或者通过切换用户登录时,为"总结":在初始命令提示符之前,执行了.bash_profile以配置shell。

  • 但是,如果我们已经登录到计算机并打开一个新的终端窗口(xterm)或者仅通过在终端中键入/bin/bash来启动一个新的bash实例,则在执行window命令之前将执行.bashrc迅速的。

如何为每个用户创建.bashrc和.bash_profile文件

  • 要了解这一点,我们必须熟悉skel,它是skeleton的缩写。

  • " skeleton"目录包含文件和目录,当用户目录由" useradd"创建时,这些文件和目录将复制到用户的主目录中

  • 默认情况下,useradd指的是/etc/default/useradd以获得skel的默认值,即/etc/skel

  • 因此,/etc/skel包含一堆隐藏的配置文件,当使用useradd命令创建主目录时,这些配置文件将被处理到用户的主目录中。

检查/etc/skel的内容。
由于文件是隐藏的,因此我将-als命令一起使用:

# ls -al /etc/skel/
total 20
drwxr-xr-x.  2 root root 4096 Nov 13  2019 .
drwxr-xr-x. 86 root root 4096 Sep  4 09:11 ..
-rw-r--r--.  1 root root   18 Aug 30  2019 .bash_logout
-rw-r--r--.  1 root root  141 Aug 30  2019 .bash_profile
-rw-r--r--.  1 root root  312 Aug 30  2019 .bashrc

.bash_profile,/etc/profile和~/.profile的执行顺序是什么

  • 按照bash的手册页,当bash作为交互式登录shell或者带有--login选项的非交互式shell被调用时,它首先从文件/etc/profile中读取并执行命令,如果该文件存在。

  • 读取该文件后,它将按顺序查找~/.bash_profile,~~ ..bash_login和~/.profile,并从存在且可读的第一个命令读取并执行命令。

  • 如果有一个名为~/.bash_profile的文件并且可读,它将被读取,而~ ..profile将被忽略。

  • 该文档说它将执行找到的列表中的第一个文件,而不是全部。

在大多数情况下,~/.bash_profile将出现在用户的主目录中。
因此,如果我们还希望同时执行~/.profile和~/.bash_profile的内容,则可以使~~ ..bash_profile源.profile成为可能,或者,如果~/.bash_profile的内容无用,可以使其成为指向.profile的符号链接

例如:

$cat >> ~/.bash_profile <<EOF
if [ -f ~/.profile ]; then
    if [ x$READING_PROFILE = x ]; then
        READING_PROFILE=yes
        export READING_PROFILE
        source ~/.profile
        unset READING_PROFILE
    fi
fi
EOF

上面的READING_PROFILE变量只是为了确保它没有输入无限递归。

我们应该修改哪个文件(.bashrc或者.bash_profile)

  • 通常,要将目录添加到" PATH"中或者定义其他环境变量,请将这些更改放入" .bash_profile"中(或者根据发行版本进行等效的更改;例如,Ubuntu使用" .profile")。

  • 对于其他所有内容,请将更改放置在.bashrc中。

  • 我们也可以选择在/etc/profile.d中创建用户特定的配置文件。

例如:

# cat /etc/profile.d/custom.sh
#!/bin/bash
if [[ "$(id -u -n)" == "hynman" ]];then
   alias ls='ls -lah'
fi
  • 因此,我们没有使用~/.bash_profile,而是在/etc/profile.d中创建了一个配置文件,该文件仅对hynman用户执行。

  • 当环境中有多个用户时,这种方法更好,更清洁。