Linux 上的 .bashrc 和 .profile 有什么区别?

已发表: 2022-09-29
显示 bash 提示符的 Linux 笔记本电脑
fatmawati achmad zaenuri/Shutterstock.com

登录到运行 Bash 的 Linux 机器会导致读取某些文件。 他们配置你的 shell 环境。 但是读取哪些文件以及何时读取可能会令人困惑。 这就是真正发生的事情。

不同类型的外壳

启动 shell 时获得的环境由配置文件或配置文件中保存的设置定义。 这些包含建立诸如文本颜色、命令提示符、别名以及在您键入程序名称时搜索可执行文件的路径等信息。

有许多不同的文件——在文件系统的不同位置——存储这些设置。 但在我们开始查看启动 shell 时读取了哪些文件之前,我们需要清楚您使用的是哪种类型的 shell。

打开计算机时究竟会发生什么?
相关当您打开计算机时究竟会发生什么?

登录 shell 是您登录的 shell。 当您启动计算机并登录时,在图形桌面环境下有一个登录 shell。 如果您通过 SSH 连接连接到另一台计算机,您也将登录到登录 shell。

打开终端窗口时获得的 shell 类型是非登录 shell。 当您已经登录时,您无需进行身份验证即可启动 shell。登录和非登录 shell 是交互式 shell。 您可以通过输入说明、按“Enter”键并阅读屏幕上的响应来使用它们。

也有非交互式外壳。 这些是执行脚本时启动的 shell 类型。 该脚本在新的 shell 中启动。 脚本顶部的 shebang #!/bin/bash指示应该使用哪个 shell。

 #!/bin/bash

echo -e "你好,世界!\n"

此脚本将在非交互式 Bash shell 中运行。 请注意,即使 shell 是非交互式的,脚本本身也可以。 该脚本打印到终端窗口,并且可以很容易地接受用户输入。

相关: 9 个 Bash 脚本示例让您开始使用 Linux

非交互式外壳

非交互式 shell 在启动时不会读取任何配置文件。 它们确实继承了环境变量,但它们对别名一无所知,例如,它们是在命令行中定义的,还是在配置文件中定义的。

您可以通过查看作为命令行参数传递给它的选项来测试 shell 是否是交互式的。 如果选项中有“i”,则 shell 是交互式的。 Bash 特殊参数$-包含当前 shell 的命令行参数。

 [[ $- == *i* ]] && echo '交互式' || echo '非交互' 

用于识别交互式和非交互式 shell 会话的 Bash 测试

让我们创建一个名为xc的别名,意思是“猫”。 我们还将检查我们是否设置了$PATH变量。

 别名 xc=cat
 回声 $PATH 

设置别名并回显 $PATH 的值

我们将尝试从这个小脚本中访问这两个。 将此脚本复制到编辑器中并将其保存为“int.sh”。

 #!/bin/bash

xc ~/text.dat
回声“变量=$PATH”

我们需要使用chmod使脚本可执行。

 chmod +x int.sh 

使用 chmod 使脚本可执行

让我们运行我们的脚本:

 ./int.sh 

运行无法访问别名但可以访问继承的环境变量的脚本

在其非交互式 shell 中,我们的脚本不能使用别名,但可以使用环境变量。 交互式 shell 在使用配置文件和配置文件方面更有趣。

相关:如何在 Linux 上的 Bash 中设置环境变量

交互式登录外壳

有两种类型的交互式登录 shell。 一种是让您登录计算机的外壳。 在桌面上,这通常是桌面环境下的外壳。 无论您使用的是窗口桌面环境还是平铺桌面环境,都必须通过 Linux 系统对您进行身份验证并允许您登录。

在没有安装桌面环境的服务器上,您可以直接登录到交互式 shell。 如果您退出桌面环境并访问终端,您可以在台式计算机上执行相同的操作。 在 GNOME 上,您可以使用 Ctrl+Alt+F3 组合键来执行此操作。 要返回 GNOME 会话,请按 Ctrl+Alt+F2 组合键。 您通过 SSH 连接的 shell 也是登录 shell。

调用的配置文件和配置文件可以使用环境变量进行设置,因此它们可能因发行版而异。 此外,并非每个发行版都使用所有文件。 在通用 Bash 安装中,交互式登录 shell 读取“/etc/profile”文件。 这包含系统范围的 shell 配置选项。 如果它们存在,该文件还会读取诸如“/etc/bash.bashrc”和“/usr/share/bash-completion/bash_completion”之类的文件。

然后 Bash 会查找“~/.bash_profile”文件。 如果它不存在,Bash 会查找“~/.bash_login”文件。 如果该文件不存在,Bash 会尝试查找“.profile”文件。 一旦找到并读取其中一个文件,Bash 就会停止搜索。 所以在大多数情况下,“~/.profile”根本不可能被读取。

通常,您会在“~/.bash_profile”中找到类似的内容,或者作为一种支持,在“~/.profile”文件中:

 # 如果运行 bash
如果 [ -n "$BASH_VERSION" ]; 然后
  # 包含 .bashrc 如果存在
  如果 [ -f "$HOME/.bashrc" ]; 然后
    . "$HOME/.bashrc"
  菲
菲

这将检查活动 shell 是否为 Bash。 如果是,它会搜索“~/.bashrc”文件并在找到时读取它。

交互式非登录外壳

Bash 交互式非登录 shell 读取“/etc/bash.bashrc”,然后读取“~/.bashrc”文件。 这允许 Bash 具有系统范围和用户特定的设置。

在编译 Bash 时,可以使用编译标志更改此行为,但遇到不来源和读取“/etc/bash.bashrc”文件的 Bash 版本将是一种罕见且特殊的情况。

每次您在桌面上打开终端窗口时,这两个文件都用于配置该交互式非登录 shell 的环境。 由应用程序启动的 shell 也会发生同样的情况,例如 Geany IDE 中的终端窗口。

您应该将配置代码放在哪里?

放置个人定制代码的最佳位置是在“~/.bashrc”文件中。 您的别名和 shell 函数可以在“~/.bashrc”中定义,它们将被读入并在所有交互式 shell 中可供您使用。

如果您的发行版没有在登录 shell 中读取您的“~/.bashrc”,而您希望它这样做,请将此代码添加到您的“~/.bash_profile”文件中。

 # 如果运行 bash
如果 [ -n "$BASH_VERSION" ]; 然后
  # 包含 .bashrc 如果存在
  如果 [ -f "$HOME/.bashrc" ]; 然后
    . "$HOME/.bashrc"
  菲
菲

模块化是最好的

如果你有很多别名,或者你想在多台机器上使用相同的别名,最好将它们存储在它们自己的文件中,并且与你的 shell 函数一样。 您可以从“~/.bashrc”文件中调用这些文件。

在我们的测试计算机上,别名存储在一个名为“.bash_aliases”的文件中,一个名为“.bash_functions”的文件保存着 shell 函数。

您可以像这样从“~/.bashrc”文件中读取它们:

 # 读入我的别名
如果 [ -f ~/.bash_aliases ]; 然后
  . ~/.bash_aliases
菲

# 读入我的 shell 函数
如果 [ -f ~/.bash_functions ]; 然后
  . ~/.bash_functions
菲
如何在 Linux 上创建别名和 Shell 函数
相关如何在 Linux 上创建别名和 Shell 函数

这使您可以轻松地在计算机之间轻松移动别名和函数。 您只需将上面的行添加到每台计算机上的“~/.bashrc”文件中,并将包含别名和 shell 函数的文件复制到每台计算机上的主目录。

这意味着您不需要将所有定义从一台计算机上的“~/.bashrc”复制到每台其他计算机上的“~/.bashrc”文件中。 这也比在计算机之间复制整个“~/.bashrc”文件要好,尤其是当它们在不同的发行版上运行 Bash 时。

总之

您真正需要了解的文件是:

  • /etc/profile :系统范围的配置设置。 由登录 shell 使用。
  • ~/.bash_profile :用于保存个人用户的设置。 由登录 shell 使用。
  • ~/.bashrc :用于保存个人用户的设置。 由交互式非登录 shell 使用。 也可以从你的“~/.bash_profile”或“~/.profile”文件中调用登录shell。

一种方便的方法是将您的个人设置放在“~/.bashrc”中,并确保您的“~./bash_profile”文件调用您的“~/.bashrc”文件。 这意味着您的个人设置保存在一个文件中。 您将在登录和非登录 shell 之间获得一致的 shell 环境。 将此与将别名和 shell 函数存储在非系统文件中相结合是一种简洁而强大的解决方案。