.bashrc、.bash-profile和.profile的区别
Bash shell使用几个启动文件来设置环境。这些文件确定了shell本身和系统用户的某些Bash shell配置。
在本教程中,我们将学习一些启动文件,如.bashrc、.bash-profile和.profile,以及它们之间的区别。
交互式shell和非交互式shell
Bash在交互式shell中提供了两种模式的选项,即登录和非登录。
当我们使用ssh登录到一个系统时,我们会得到一个交互式登录shell。这个shell在被调用时读取启动文件。 然而,当我们在一个已经登录的shell上调用一个新的shell时,我们将得到一个交互式的、非登录的shell。这种类型的shell只执行.bashrc文件。
当shell不需要任何人为干预来执行命令时,我们称其为非交互式shell。例如,当脚本派生出一个子shell来执行命令时,该子shell是非交互式shell。这个shell不执行任何启动文件。它从创建它的shell继承环境变量。
Bash启动文件
启动文件包含shell启动时要执行的命令。因此,shell将自动执行这些文件中提供的命令来设置shell。这甚至发生在命令提示符显示之前。
.bash_profile的意义
.bash_profile文件包含设置环境变量的命令。因此,未来的shell将继承这些变量。
在交互式登录shell中,Bash首先查找/etc/profile文件。如果找到,Bash将读取并在当前shell中执行它。因此,/etc/profile为所有用户设置环境配置。
类似地,Bash然后检查主(home)目录中是否存在.bash_profile。如果是,那么Bash在当前shell中执行.bash_profile。然后Bash停止查找其他文件,如.bash_login和.profile。
如果Bash没有找到.bash_profile,那么它将按此顺序查找.bash_login和.profile,并仅执行第一个可读文件。
让我们看一下.bash_profile示例文件。这里我们设置并导出PATH变量:
echo "Bash_profile execution starts.." PATH=$PATH:$HOME/bin; export PATH; echo "Bash_profile execution stops.."
在交互式登录shell的命令提示符之前,我们将看到以下输出:
Bash_profile execution starts.. Bash_profile execution stops.. [hduser@xueai8 ~]$
.bashrc的意义
.bashrc包含特定于Bash shell的命令。每个交互式非登录shell首先读取.bashrc。通常,.bashrc是添加别名和Bash相关函数的最佳位置。
Bash shell在主(home)目录中查找.bashrc文件,并在当前shell中使用source执行该文件
让我们看一下.bashrc文件的示例:
echo "Bashrc execution starts.." alias elui='top -c -u $USER' alias ll='ls -lrt' echo "Bashrc execution stops.."
在交互式非登录shell的命令提示符之前,我们将看到以下输出:
[hduser@xueai8 ~]$ bash Bashrc execution starts.. Bashrc execution stops.. [hduser@xueai8 ~]$
.profile的意义
在交互式shell登录期间,如果主(home)目录中不存在.bash_profile, Bash将查找.bash_login。如果找到,Bash执行它。如果主(home)目录中不存在.bash_login, Bash将查找.profile并执行它。
.profile可以保存与.bash_profile或.bash_login相同的配置。它控制提示外观、键盘声音、打开的shell,以及覆盖/etc/profile文件中设置的变量的个人配置文件设置。
区别
在每次交互式登录时,Bash shell执行.bash_profile。如果在主目录中没有找到.bash_profile,那么Bash将执行从.bash_login和.profile中找到的第一个可读文件。然而,在每次交互式非登录shell启动时,Bash执行.bashrc。
通常,环境变量放在.bash_profile中。由于交互式登录shell是第一个shell,因此环境设置所需的所有默认设置都放在.bash_profile中。因此,它们只被设置一次,但在所有子shell中被继承。
同样,别名和函数也放在.bashrc中,以确保每次从现有环境中启动shell时都加载它们。
但是,为了避免登录和非登录交互shell设置的差异,.bash_profile调用.bashrc。因此,我们将看到下面的代码片段被插入到.bash_profile中,这样在每个交互式登录shell中,.bashrc也会在同一个shell中执行:
if [ -f ~/.bashrc ];
then
. ~/.bashrc;
fi
PATH=$PATH:$HOME/bin export PATH
结论
总之,在实际使用shell环境之前,shell需要它的启动文件来配置shell环境。