.bashrc与.bash_profile的区别
我们有不同的配置文件,这些文件用于设置系统范围的配置。
但是我们总是需要设置用户特定的自定义设置,例如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
的内容。
由于文件是隐藏的,因此我将-a
与ls
命令一起使用:
# 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用户执行。当环境中有多个用户时,这种方法更好,更清洁。