发布日期:2024-12-20 VIP内容

.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环境。