配置文件和 RC 文件

作者:Shawn Powers

我热爱 Linux,如果您正在阅读这篇文章,很可能您也是。 但说实话,Linux 环境的某些方面令人困惑。 对我来说,最令人困惑的之一就是配置文件系统。 从概念上讲,它很简单。 有所有用户都继承的系统级设置,然后是人们可以自行设置的个人设置。 问题在于不同的发行版以不同的方式处理配置文件,以及登录 shell 与交互式 shell 的概念开始发挥作用。 通常,这不是 Linux 用户担心的事情。 但是,当您需要进行更改时,弄清楚以什么顺序加载了什么,以及哪些仅由登录 shell 查看等等,可能会非常令人沮丧。

登录 Shell

首先,让我澄清一下我所说的登录 shell 的意思。 您可能已经注意到,有时为了进入终端 shell,系统会提示您输入用户名和密码。 而在其他时候,您只需单击终端图标,就会出现一个已经登录的终端。 当您使用 GUI 桌面环境时,您最常会遇到这种情况。 基本上,如果您已经登录到您的 Linux 桌面,并且打开一个终端窗口,那么它就是一个交互式 shell。

然而,它不一定必须在图形桌面环境内。 如果您 ssh 进入远程服务器,系统会提示您输入用户名和密码(因此,这是一个登录 shell)。 如果您然后在该 SSH 会话中键入 bash,您将启动一个全新的终端,但这次,它是一个交互式 shell(请注意,系统不会提示您输入密码)。 稍后我将讨论它为什么重要,但为了便于理解,请记住,如果系统提示您输入用户名和密码,那么它很可能是一个登录 shell。 如果您直接进入 bash 提示符,那么它很可能是一个交互式 shell。 这种情况的一个相当常见的例外是,如果您设置了 SSH 密钥以自动登录。 在这种情况下,即使系统没有提示您输入用户名和密码,它仍然是一个登录 shell。 如果您使用 SSH 登录,那么它很可能是一个登录 shell,这是一个相当安全的推断。

登录 Shell 进程

登录 shell 进程比交互式 shell 复杂得多,所以我将首先介绍该进程。 我假设您的用户在他们的 /etc/passwd 文件中分配了一个 bash shell。 它是用户最常用的 shell,因此熟悉它的细微差别是有意义的。

步骤 1: 当您在登录 shell 中进行身份验证时,系统会查找一个名为 /etc/profile 的文件。 该文件是一个 shell 脚本,它分配了一些所有用户都应该设置的环境变量。

步骤 2: /etc/profile 脚本通常以调用 /etc/profile.d 文件夹中的任何 shell 脚本并执行它们作为结尾。 通常,它只会运行 /etc/profile.d 中以 .sh 扩展名结尾的 shell 脚本,因此请查看 /etc/profile 脚本,了解文件应如何格式化才能正确运行。 拥有一个文件夹来添加自定义脚本非常重要,因为如果您想将系统范围的更改添加到每个人的登录 shell 中,则将命令添加到 /etc/profile 文件是危险的。 任何影响 /etc/profile 的系统更新都会覆盖您的更改。 如果您只是在 /etc/profile.d 文件夹中添加一个自定义文件,即使 /etc/profile 脚本已更新,它也会被更新后的脚本读取。

步骤 3: /etc/profile 脚本还会执行用户的个人配置文件。 这部分有点混乱,因为用户配置文件可能会根据发行版和/或用户自定义而有不同的名称。 一般来说,系统将尝试按以下顺序按名称加载配置文件

  • .bash_profile

  • .bash_login

  • .profile

如果在用户的主目录中找到具有该名称的文件,它将执行该文件并停止。 这意味着,如果您的主目录中同时有 .bash_profile 和 .profile,则只会执行 .bash_profile。 如果您想自定义您的配置文件,但又不想更改分配给您的原始用户配置文件,那么了解这一点很有用。 默认情况下,在 Ubuntu 中,每个用户都有一个 .profile 文件,但没有 .bash_profile 或 .bash_login。 因此,如果您想自定义您的配置文件,只需将您主目录中的 .profile 文件复制到一个名为 .bash_profile 的文件中,并对 .bash_profile 进行任何您想要的更改。 这样做将使您的原始 .profile 文件保持完整,并且仍然允许您尽情自定义。 请记住,如果您创建一个空的 .bash_profile,系统会将其视为您选择的配置文件,并完全忽略您的 .profile 文件!

步骤 4: 最后,登录 shell 操作顺序的最后一步是存储在用户目录中的 .bashrc 文件。 这是另一个脚本——这个脚本是从步骤 3 中的 .profile 脚本调用的。 请注意,如果您自定义您的用户配置文件设置,您需要确保您使用的任何配置文件实际上都调用了 .bashrc 脚本。 正是在 .bashrc 脚本中设置了个人设置,例如自定义提示符和颜色设置,以及您可能想要设置的命令别名(稍后会详细介绍)。

步骤 5: 此步骤实际上不是在步骤 4 之后发生的; 相反,它有点在步骤 1 分支出来。 /etc/profile 脚本启动了加载用户配置文件的过程,但它也启动了执行系统范围的 bashrc 文件的过程。 同样,不同的发行版对此文件有不同的命名,但通常是名为 /etc/bashrc 或 /etc/bash.bashrc 的文件。 就 Ubuntu 而言,它是 /etc/bash.bashrc,但从历史上看,它通常是 /etc/bashrc。 请注意,与用户的 .bashrc 文件不同,系统范围的 bashrc 文件不以句点开头。

更糟糕的是,某些系统实际上不会为登录 shell 执行系统范围的 bashrc 文件,因此,如果您在 /etc/profile 脚本中没有看到调用它,则意味着它不会为登录 shell 执行。 但是,在大多数情况下,大多数发行版上的 /etc/profile 确实调用了系统范围的 bashrc 文件。 既然您知道配置文件的加载顺序,您就可以在您自己的系统上进行调查,以查看在登录 shell 启动期间实际加载了什么。

交互式 Shell 进程

交互式 shell 的启动过程要简单得多。 当一个人打开一个交互式 shell(一个不验证用户名或密码的 shell)时,会发生以下步骤。

步骤 1: 执行 /etc/bashrc 或 /etc/bash.bashrc 文件。 无论它是否在 /etc/profile 中被引用,都会发生这种情况。 虽然登录 shell 会自动启动 /etc/profile 脚本,但交互式 shell 会自动启动 /etc/bashrc(或 /etc/bash.bashrc)脚本。

步骤 2: 执行用户主目录中的 .bashrc。 同样,与系统范围的 bashrc 文件一样,这也不是从用户配置文件中调用的; 而是由交互式 shell 直接执行的。 因此,即使您已从 .profile 脚本中删除了对 .bashrc 的引用,交互式 shell 仍然会执行它。

就这样! 交互式 shell 完全不查找任何配置文件信息,无论是系统范围的还是用户目录中的。 然而,由于交互式 shell 是用于初始登录的登录 shell(通过 GUI 或 SSH)的“子”进程,因此它继承了初始登录 shell 获取的所有配置文件信息。 因此,尽管初始登录 shell 和“子”交互式 shell 都加载了相同的配置文件信息,但重要的区别在于交互式 shell 不会重新加载配置文件信息。 它们永远不会查看配置文件脚本,因此初始登录脚本加载的任何信息都是它们可以访问的全部信息。 (当您看到脚本实际执行的操作时,这种区别将变得更加重要。)

配置文件做什么?

首先,免责声明:我只能说明通常使用配置文件和 bashrc 脚本完成的操作。 当然,人们可以通过自定义配置文件或 bashrc 脚本来更改完成的操作。 通常,坚持标准是好的做法。

配置文件主要用于加载环境变量。 由于配置文件由登录 shell 加载,而登录 shell 是进入系统的初始入口点,因此此时设置环境最有意义。 最重要的环境变量之一是 PATH 变量。 当启动登录 shell 时,会设置 PATH。 其他环境变量也可以在系统范围的配置文件或个人用户配置文件中设置,但只需知道配置文件系统是设置大多数变量的地方。

配置文件信息的加载顺序非常重要,因为如果您想覆盖系统范围的默认配置文件信息,您可以通过在您的个人用户配置文件脚本中指定环境变量来做到这一点。 例如,PATH 变量通常在登录时由用户的配置文件脚本修改。 通常,如果用户在他们的主目录中有自己的 bin 文件夹,.profile(或 .bash_profile 等,请参见上文)脚本会将 ~/bin 添加到 PATH 变量中。 由于用户配置文件在系统范围的配置文件之后加载,因此用户设置优先并覆盖系统范围的设置。

RC 文件做什么?

同样,这是一种概括,但系统范围的 bashrc 文件和个人用户的 .bashrc 脚本通常会设置命令行的个人偏好。 如果您想要自定义提示符,或者喜欢特定的配色方案,则可以在 bashrc 系统中进行设置。 与配置文件系统非常相似,用户的 .bashrc 文件会覆盖系统范围的 bashrc(或 bash.bashrc,再次参见上文)设置。 这意味着您可以根据自己的喜好自定义命令行的行为,而不会影响系统上的其他用户。

在 .bashrc 文件中最常见的自定义是添加别名。 别名有点像文本扩展,它将您定义的别名替换为您指定的任何命令。 例如,以下是用户文件夹中 .bashrc 文件中的一个片段


alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'

这些别名使得如果用户在命令行中键入 ll,系统将执行 ls -alF 而不是。 这是一种为带有神秘选项的命令或您经常键入的命令创建快捷方式的好方法。

虽然我不建议胡闹,但 .bashrc 别名也是一个很棒的方式来恶作剧您的同事,如果他们让他们的系统保持登录状态。 假设您创建了一个像这样的别名


alias ls='echo "Deleting all files..."'

然后,每次他们键入 ls 时,他们都会感到一点(无辜的)惊喜! 是的,使用别名很容易进行恶作剧,但由于我们都在离开工作站时注销,所以我们永远不必担心它,对吧?!

一些陷阱

了解 shell 的工作原理确实使故障排除变得容易得多。 您可能已经意识到了一些事情,但它们值得一提。 如果您更改任何配置文件脚本,则在您启动新的登录 shell 之前,这些更改将不会被识别。 .bashrc 更改也是如此,但是由于您可以轻松关闭交互式 shell 并启动一个新的 shell,因此 .bashrc 更改更容易激活。

关于配置文件加载的主要问题之一是,如果您更改了环境变量设置(例如 PATH 变量),您实际上必须注销并重新登录才能测试您的更改。 您当然可以在交互式 shell 上设置路径变量,但请记住,任何新的交互式 shell 都将继承原始登录 shell 的配置文件设置,因此通常注销并重新登录确实是进行永久更改的唯一方法。

此外,尽管我已经介绍过,但我想重申,虽然系统范围的配置文件 (/etc/profile) 和用户配置文件通常会调用 bashrc 脚本,但它们不必这样做。 如果您更改了您的配置文件设置,则您的登录 shell 的行为可能与您的交互式 shell 的行为非常不同。 如果那是您的目标,那很好,但通常您希望确保您的登录 shell 也执行 bashrc 内容,因为这些信息使用户体验更有用。

最后,我想补充一点,了解和学习配置文件和 RC 文件的最佳方法是玩转您的系统。 学习如何操作您的设置不仅具有教育意义,而且还可以使您的计算体验更加方便。

Shawn 是 Linux Journal 的副编辑,并且从一开始就接触 Linux。 他对开源充满热情,并且热爱教学。 他也喝太多咖啡,这经常在他的写作中表现出来。

加载 Disqus 评论