第13章:用户环境

13.4.1 bash Shell

在bash中,你可以选择启动文件名 .bash_profile.profile.bash_login.bashrc。哪一个适合你的命令路径、手册页路径、提示符、别名和权限掩码?答案是:你应该有一个 .bashrc 文件,并附带一个指向 .bashrc.bash_profile 符号链接,因为存在几种不同的 bash shell 实例类型。

两种主要的 shell 实例类型是交互式非交互式,但我们只关心交互式 shell,因为非交互式 shell(例如运行 shell 脚本的那些)通常不读取任何启动文件。交互式 shell 是你用来从终端运行命令的 shell,比如你在本书中看到的那些,它们可以进一步分为登录 shell非登录 shell

登录 Shell

传统上,当你首次使用 /bin/login 等程序通过终端登录系统时,得到的就是一个登录 shell。通过 SSH 远程登录也会得到一个登录 shell。基本概念是:登录 shell 是一个初始 shell。你可以通过运行 echo $0 来判断一个 shell 是否为登录 shell;如果第一个字符是 -,则该 shell 是登录 shell。

当 bash 作为登录 shell 运行时,它首先执行 /etc/profile。然后它查找用户的 .bash_profile.bash_login.profile 文件,只运行它找到的第一个文件。

听起来可能有些奇怪,但可以通过将非交互式 shell 作为登录 shell 运行,来强制它读取启动文件。为此,可以使用 -l--login 选项启动 shell。

非登录 Shell

非登录 shell 是在登录之后运行的额外 shell。它只是任何不是登录 shell 的交互式 shell。窗口系统终端程序(xterm、GNOME 终端等)启动的是非登录 shell,除非你特别要求启动登录 shell。

作为非登录 shell 启动时,bash 运行 /etc/bash.bashrc,然后运行用户的 .bashrc

两种 Shell 带来的后果

两种不同启动文件背后的理由是:在过去,用户通过传统终端使用登录 shell 登录,然后通过窗口系统或 screen 程序启动非登录子 shell。对于非登录子 shell,重复设置用户环境并运行一堆已经运行过的程序被认为是一种浪费。使用登录 shell,你可以在 .bash_profile 等文件中运行花哨的启动命令,而只在 .bashrc 中保留别名和其他“轻量级”的东西。

如今,大多数桌面用户通过图形化显示管理器登录(你将在下一章了解更多)。大多数这类登录会启动一个非交互式登录 shell,以保留登录与非登录模型。如果不这样做,你需要在 .bashrc 中设置整个环境(路径、手册路径等),否则在终端窗口 shell 中你将永远看不到任何环境设置。然而,如果你曾经想在控制台或远程登录,你也需要一个 .bash_profile,因为这些登录 shell 根本不会理会 .bashrc

示例 .bashrc

为了同时满足非登录 shell 和登录 shell,如何创建一个也可以用作 .bash_profile.bashrc?这里有一个非常基础(但完全足够)的示例:

# 命令路径.
PATH=/usr/local/bin:/usr/bin:/bin:/usr/games
PATH=$HOME/bin:$PATH
# PS1 是常规提示符.
# 替换包括:
# \u 用户名 \h 主机名 \w 当前目录
# \! 历史编号 \s shell 名称 \$ $ 如果是普通用户
PS1='\u\$ '
# EDITOR 和 VISUAL 决定程序(如 less 和邮件客户端)在要求编辑文件时调用的编辑器.
EDITOR=vi
VISUAL=vi
# PAGER 是 man 等程序的默认文本文件查看器.
PAGER=less
# 这些是 less 的一些有用选项.
# 另一种风格是 LESS=FRX
# (F=结束时退出, R=显示原始字符, X=不使用备用屏幕)
LESS=meiX
# 必须导出环境变量.
export PATH EDITOR VISUAL PAGER LESS
# 默认情况下,赋予其他用户对大多数新文件的只读权限.
umask 022

在这个启动文件中,路径将 $HOME/bin 放在前面,以便其中的可执行文件优先于系统版本。如果需要系统可执行文件,可以添加 /sbin/usr/sbin

如前所述,你可以通过符号链接共享这个 .bashrc 文件与 .bash_profile,或者通过创建如下一行内容的 .bash_profile 使关系更清晰:

. $HOME/.bashrc

检查登录 shell 和交互式 shell

.bashrc.bash_profile 匹配时,通常不需要为登录 shell 运行额外的命令。但是,如果你想为登录 shell 和非登录 shell 定义不同的操作,可以在 .bashrc 中添加以下测试,它检查 shell 的 $- 变量中是否包含 i 字符:

case $- in
 *i*) # 交互式命令放在这里
    command
    --snip--
    ;;
 *)   # 非交互式命令放在这里
    command
    --snip--
    ;;
esac

13.4.2 tcsh Shell

几乎所有 Linux 系统上的标准 csh 都是 tcsh,它是一种增强的 C shell,推广了命令行编辑和多模式文件名与命令补全等功能。即使你不将 tcsh 作为新用户的默认 shell(bash 应该是默认的),你仍然应该提供 tcsh 启动文件,以防用户偶然用到 tcsh。

在 tcsh 中,你不必担心登录 shell 和非登录 shell 之间的区别。启动时,tcsh 查找 .tcshrc 文件。如果找不到,它就会查找 csh shell 的 .cshrc 启动文件。这样排序的原因是,你可以使用 .tcshrc 文件来存放 tcsh 的扩展功能,而这些功能在 csh 中无法工作。你可能应该坚持使用传统的 .cshrc 而不是 .tcshrc;几乎没人会将你的启动文件用于 csh。而且,如果用户真的在其他系统上遇到 csh,你的 .cshrc 也能正常工作。

示例 .cshrc

以下是一个示例 .cshrc 文件:

# 命令路径.
setenv PATH $HOME/bin:/usr/local/bin:/usr/bin:/bin
# EDITOR 和 VISUAL 决定程序(如 less 和邮件客户端)在要求编辑文件时调用的编辑器.
setenv EDITOR vi
setenv VISUAL vi
# PAGER 是 man 等程序的默认文本文件查看器.
setenv PAGER less
# 这些是 less 的一些有用选项.
setenv LESS meiX
# 默认情况下,赋予其他用户对大多数新文件的只读权限.
umask 022
# 自定义提示符.
# 替换包括:
# %n 用户名 %m 主机名 %/ 当前目录
# %h 历史编号 %l 当前终端  "

13.5 默认用户设置

编写启动文件并为新用户选择默认值的最佳方法是在系统上使用一个新的测试用户进行实验。创建一个空主目录的测试用户,并避免将你自己的启动文件复制到该测试用户目录。从头开始编写新的启动文件。

当你认为配置可以工作时,以所有可能的方式(控制台、远程等)登录为测试用户。确保尽可能多地测试,包括窗口系统操作和手册页。当对测试用户感到满意时,创建第二个测试用户,从第一个测试用户复制启动文件。如果一切仍然正常工作,你现在就拥有了一套可以分发给新用户的新启动文件。

本节概述了合理的默认设置。

13.5.1 Shell 默认值

Linux 系统上新用户的默认 shell 应该是 bash,因为:

  • 用户与编写 shell 脚本时使用的 shell 是同一个 shell。(出于多种原因,在此不展开说明,csh 是一个臭名昭著的糟糕脚本工具——连想都不要想。)
  • bash 是 Linux 发行版的默认 shell。
  • bash 使用 GNU readline 库来接受输入,因此其界面与许多其他工具完全相同。
  • bash 在 I/O 重定向和文件句柄方面提供了精细且易于理解的控制。

然而,许多经验丰富的 Unix 高手会使用 csh 或 tcsh 这类 shell,仅仅因为这是他们最熟悉的环境,而且他们无法忍受更换。当然,你可以选择任何你喜欢的 shell,但如果你没有偏好,请选择 bash,并将其用作系统上新用户的默认 shell。(用户可以使用 chsh 命令根据自己的偏好更改 shell。)

NOTE

还有许多其他 shell(rc、ksh、zsh、es 等)。有些不适合作为初学者 shell,但 zsh 和 fish 有时在寻找替代 shell 的新用户中很受欢迎。

13.5.2 编辑器

在传统系统上,默认编辑器是 viemacs。这两个几乎是所有 Unix 系统上都保证存在(或至少可用)的编辑器,这意味着从长远来看,它们给新用户带来的麻烦最少。然而,Linux 发行版通常将 nano 配置为默认编辑器,因为它对初学者来说更容易使用。

与 shell 启动文件一样,避免使用过大的默认编辑器启动文件。在 .exrc 启动文件中加一点 set showmatch(让 vi 显示匹配的括号)从来不会有什么问题,但请远离任何显著改变编辑器行为或外观的设置,例如 showmode 功能、自动缩进和换行边距。

13.5.3 分页器

分页器是一种程序,例如 less,它一次显示一页文本。将默认的 PAGER 环境变量设置为 less 是完全合理的。

13.6 启动文件陷阱

避免启动文件中的这些陷阱:

  • 不要在 shell 启动文件中放置任何图形命令。并非所有 shell 都在图形环境中运行。
  • 不要在 shell 启动文件中设置 DISPLAY 环境变量。我们还没有讨论图形环境,但这可能导致图形会话行为异常。
  • 不要在 shell 启动文件中设置终端类型。
  • 不要在默认启动文件中吝啬添加描述性注释。
  • 不要在启动文件中运行向标准输出打印内容的命令。
  • 永远不要在 shell 启动文件中设置 LD_LIBRARY_PATH(参见第 15.1.3 节)。

13.7 进一步启动主题

由于本书只涉及底层的 Linux 系统,我们将不涉及窗口环境的启动文件。这确实是一个大问题,因为将你登录到现代 Linux 系统的显示管理器有其自己的一套启动文件,例如 .xsession.xinitrc,以及 GNOME 和 KDE 相关文件的无穷组合。

窗口选择可能令人困惑,而且在 Linux 中没有一种通用的方式来启动窗口环境。下一章将描述其中许多可能性。然而,当确定你的系统做什么时,你可能会对与图形环境相关的文件有些过分热衷。这没问题,但不要将其延续到新用户身上。同样在 shell 启动文件中保持简单的原则,对于 GUI 启动文件也非常有效。事实上,你可能根本不需要更改 GUI 启动文件。


(文本涉及的图片引用:第 361 页上的图片 2327、2321、2325、2317、2323、2316、2320、2315、2319)