对话 UNIX: 第 10 部分,定制您的 Shell( 三 )


在 UNIX 的早期(二十多年以前),用户通常通过一个哑终端来访问 UNIX 计算机 。您需要在登录提示符处输入用户 ID 和密码,而系统将为您的会话产生一个新的登录 Shell 。在这种环境中,登录 Shell 和其他的 Shell 实例(比如那些运行 Shell 脚本的 Shell)通过名字相互区别:每个登录 Shell 的进程名字都以一个连字符作为前缀,如 -bash 。这个特殊的名字(历史悠久的 UNIX 产物)可以告诉 Shell 为登录工作运行任何特殊的配置 。
交互的 Shell 更容易解释:如果 Shell 对您的输入(标准输入)作出反应并显示相应的输出(标准输出),那么这个 Shell 是交互的 。现在,X 终端已经取代了哑终端,但是 Shell 模式的约定和范例仍然保留了下来 。通常,X 终端作为 -bash 产生 Bash,强制 Bash 执行登录启动序列 。
对于 Bash,交互的登录 Shell 将运行 /etc/profile,如果它存在 。(如果使用 bash --login 调用 Bash,那么非交互的 Shell 也运行 /etc/profile 。)接下来,交互的登录 Shell 寻找 ~/.bash_profile,如果这个脚本存在并且是可读的,那么将执行这个脚本 。否则,Shell 将继续尝试执行 ~/.bash_login 。如果后面的那个文件不存在或者是不可读的,那么 Bash 最后将尝试执行 ~/.profile 。Bash 仅运行一个针对个人的启动文件,然后立即停止启动序列 。当 Bash 登录 Shell 退出时,它将执行 ~/.bash_logout 。
如果 Bash Shell 是交互的,但不是登录 Shell,那么 Bash 将尝试读取 ~/.bashrc 。并不执行其他的文件 。如果 Bash Shell 是非交互的,那么它将扩展 BASH_ENV 环境变量的值,并执行所指定的文件 。
当然,您可以在 Bash 的标准脚本中调用自己的脚本,以便提供附加的设置 。特殊的 Shell 缩写 .(或者它的同义词 source)表示执行另一个 Shell 脚本 。例如,如果您希望在交互的登录 Shell 和交互的非登录 Shell 之间共享 ~/.bashrc 中的设置,可以使用下面的命令:
. ~/.bashrc
在 ~/.bash_profile 中 。当 Shell 碰到点 (.) 命令时,它将立刻执行指定的 Shell 脚本 。
深入研究 Shell
研究启动序列的最好的方法是创建一些简单的 Shell 启动文件 。例如,如果您运行 ssh farfaraway ls 命令,SSH 在远程系统上产生的名为 farfaraway 的远程 Shell 是一个登录 Shell 吗?是交互的 Shell 吗?让我们来找出答案 。
清单 1、2、3、和 4 分别地显示了示例 /etc/profile、~/.bash_ profile、~/.bashrc、和 ~/.bash_logout 文件 。(如果这些文件已经存在,在您继续这个练习之前请进行备份 。要更改 /etc/profile,您需要在您的计算机上有超级用户的权限 。)使用您最喜爱的文本编辑器创建如下所示的文件 。
清单 1 显示了示例 /etc/profile 脚本 。这个文件是第一个运行的启动文件(如果它存在并且是可读的) 。
清单 1. 示例 /etc/profile 文件
echo "Executing /etc/profile."
PATH="/bin:/sbin:/usr/bin:/usr/sbin"
export PATH
清单 1 回应一条消息作为脚本的开始,并且设置最小限度的 PATH 变量 。同样地,如果 Shell 是交互的登录 Shell,那么将运行这个文件 。例如,启动一个新的 X 终端 。您应该看到与下面所示类似的内容:
Last login: Tue Apr 17 21:06:23 on ttyp1
Executing /etc/profile
(Interactive, login shell)
Executing /Users/strike/.bash_profile
(Interactive, login shell)
Including /Users/strike/.aliases
strike @ blackcat 1 $
很好!当您在 X 终端中启动一个新的登录 Shell 时,将看到这个可预知的序列 。请注意 Shell 提示符:它反映出了用户名、简写的主机名(第一个点前面的部分)、以及命令编号 。
如果您在提示符处输入 logout 或者 exit,您应该看到下面的信息:

推荐阅读