unix & Linux 教程学习_9

第14章 使用shell: 初始化文件

14.1 初始化文件和注销文件

所有的shell都允许指定某些命令按照自己的需要自动执行。您的工作就是使用这些命令准确地按照自己的希望设置工作环境。具体过程如下:
首先,要创建两个特殊的文件,即初始化文件(initialzation file). 在第一个文件,即登录文件(login file)中,存放着所有希望在每次登录时自动执行的命令。在第二个文件,即环境文件(environment file)中, 存放差所有希望在新shell启动时自动执行的命令。
为了提供更多的定制功能, 一些shell还支持注销文件(logout file).
总而言之, 登录文件、环境文件、注销文件允许您在3个不同的时间执行那些希望自动执行的命令,这3个时间分别是登录时、新shell启动时和注销时。
这3个文件的名称在各个shell中各不相同.

shell 登录文件 环境文件 注销文件
C-Shell .login .cshrc .logout
Tcsh .login .tcshrc、.cshrc .logout
Bourne Shell .profile --- ---
Korn Shell .profile $ENV ---
Bash(默认) .bash_profile、 .bash_login .bashrc .bash_logout
Bash(POSLX) .profile $ENV .bash_logout

所有的初始化文件和注销文件都是.(点)文件(dotfile)

14.2 初始文件和注销文件的名称

\(~~~~~~\)C-Shell家族中初始化文件和注销文件比较直接和简单。登录文件是.login, 环境文件是.cshrc(C-Shell)和.tcshrc(Tcsh), 而注销文件是.logout.
\(~~~~~~\)Bourne shell家族使用的名称需要花些时间解释。 在20世纪90年代初,创建了一组POSIX1003.2的规范,以描述"标准的"Unix shell。 POSIX标准的大部分内容都根据Bourne shell家族的模型来确定。实际上,现代的Bourne shell(Bash, Korn shell, FreeBSD)都遵循1003.2标准。
POSIX标准要求shell应该支持登录文件和环境文件, 但是没有必要支持注销文件。 登录文件的名称应该是.profile. 但是为了保持灵活性, 环境文件的名称没有固定,而采取在名为ENV的环境变量中存放环境文件的名称的方法。
\(~~~~~~\)Bash有所不同,它设计成以两种不同模式运行:默认模式(追求功能和灵活性)和POSIX模式(追求兼容性)。 在默认模式中,Bash支持POSIX标准的增强版; 在POSIX模式, Bash严格遵循1003.2标准。
\(~~~~~~\)在默认模式------您和我通常使用的模式中, Bash查找一个名为.bash_profile或者.bash_login的登录文件(使用哪一个文件取决于自己的希望)和一个名为.bashrc的环境文件。
\(~~~~~~\)在两种模式------默认模式和POSIX模式------中, Bash都使用一个名为.bash_logout的注销文件。
那什么类型的命令应该放在初始化文件和注销文件中呢?

14.3 点文件和rc文件

\(~~~~~~\)如前所述,所有的文件名都以一个点号开头: 其次, 环境文件的名称都以rc结尾。
\(~~~~~~\)以一个点号开头的文件即点文件或隐藏文件。
ls命令不列举任何点文件,除非使用了-a(all files)先项.
rc文件: 标识rc代表"run commands, 运行命令

14.4 使用简单的文本编辑器

简单编辑器: pico, nano.
vi(or vim) 或 Emacs

14.5 登录shell和非登录shell

交互式和非交互式shell:

当在shell提示处输入命令时,使用的是交互式shell;

登录shell
非登录shell

当运行shell脚本时,使用的是非交互式shell.

为了理解如何使用初始化文件,我们需要将分析深入一步,因为交互式shell有两种不同的类型
\(~~~~~~\)登录时启动的shell称为登录shell。 其它交互式shell称为非登录shell。
这两种shell之间的区别非常重要,因为登录shell和非登录shell的初始化文件的处理方式大不相同。

1. 虚拟控制台和终端窗口

当使用桌面环境时,获得shell提示的方式有两种:打开一个终端窗口或者切换到虚拟控制台。当使用虚拟控制台时---假如通过按<Ctrl-Alt-F1>组合键要求进行登录。当进行登录时,就会启动一个登录shell。 另一方面,如果只是简单地打开一个终端窗口,则启动一个非登录shell(因为没有进行登录)

2. 启动新shell

在任何时候,都可以通过输入shell的名称启动一个新shell。 例如,假如您正在使用的shell是Bash,而您希望试一试Tcsh。为此,只需输入tcsh即可。新shell是一个非登录shell(因为没有进行登录)

3. 使用远程主机

使用ssh(Secure Shell, 安全shell)可以连接到远程Unix主机。 一旦ssh连接到远程主机,则必须进行登录,因此,这启动了一个登录shell.

14.6 何时执行初始化文件

  1. 登录shell执行登录文件和环境文件。
  2. 非登录shell只执行环境文件。

Bash(默认模式):

  • 登录shell: .bash_profile
  • 非登录shell: .bashrc

Bash(POSIX模式)

  • 登录shell: .profile, 然后$ENV
  • 非登录shell:$ENV

Korn shell

  • 登录shell: .profile, 然后$ENV
  • 非登录shell: $ENV

只有Bash的登录shell只执行登录文件, 而不执行环境文件。 对于其他所有的shell来说, 登录shell既执行登录文件, 也执行环境文件, 并按照这个顺序执行。
'================================='
C-Shell

  • 登录shell: .cshrc, 然后.login
  • 非登录shell: .cshrc

Tcsh

  • 登录shell: .tcshrc, 然后.login
  • 非登录shell: .tcshrc

在C-Shell家族中, 登录shell首先执行环境文件。 在Bourne shell家族中, 登录shell首先执行登录文件。 为了理解为什么会这样,需要讨论一下初始化文件的历史。

14.7 shell初始化文件的历史简介

\(~~~~~~\)Unix shell由Ken Thompson编写,并在 20世纪70年代初期在贝尔实验室中使用。这个shell并没有使用标准化的初始化文件,70年代中期,贝尔实验室的程序员编写了两种新的替代shell: Mashey shell(也称PMB shell)和Bourne shell. 一个名叫Dick Haight的程序员在Mashey shell中添加了对初始化文件(.profile)的支持。 后来,Bourne shell中也加这一特性。

\(~~~~~~\).profile文件只在登录时执行一次。 1987年,当Bill Joy在加利福尼亚大学伯克利分校开发C-Shell时,他通过使用两个文件替代一个文件, 增强了初始化过程。 第一个文件是.cshrc, 每次有新shell启动时都运行。 第二个文件是.login, 只在登录shell启动时运行。 因此,.jogin在.cshrc之后执行才有意义, 因为它的工作就是运行那些在登录时需要的额外命令。

$~~~~~~$1982年,贝尔实验室的David Korn为Bourne shell开发了另一种替代产品,即Korn shell. Korn采纳了Bill Joy使用两个初始化文件的思想, 即现在所谓的环境文件(.cshrc)和登录文件(.login). 因为Korn在贝尔实验室工作, 而贝尔实验室也是Bourne shell的工作间,所以他为登录广播使用了名称.profile。 在命名环境文件时, Korn决定让用户自己选择环境文件的名称, 即将ENV变量的值设置成环境文件的名称。 通过这种方式, 可以根据不同目的定义不同的环境文件。

\(~~~~~~\)但是, 一旦做出这个决定, Korn必须确保登录文件在环境文件之前执行。 否则, 用户就没有办法设置ENV变量了。

\(~~~~~\)这就是为什么现在Bourne shell家族的shell首先运行登录文件,而C-Shell家族的shell首先执行环境文件的原因(这些历史其实是蛮有趣的)。

14.8 初始化文件中放置什么内容

登录文件有两项任务: 设置环境以及初始化工作会话。 因此,登录文件中应该包含下述命令:(1)创建或者修改环境变量的命令; (2)执行所有一次性操作的命令。
设置PATH, umask。如果登录文件是远程主机的,那么还要使用stty命令修改映射。 最后, 还可能希望在每次登录时显示一个个人消息或其他信息。
正如前面讨论的,环境自动地被所有的子进程(包括新shell)所继承。 因此,环境变量(如PATH)只需要在登录文件中设置一次。 在环境文件中设置环境变量并没有意义, 环境文件中设置的变量在新shell启动时将被复位。
环境文件有一项不同的任务: 设置不能在环境中保存的自定义项,特别是shelltfqp项、 别名和函数。 因为这些设置没有存储在环境中, 所以每次启动新shell时必须重新创建它们。

14.9 显示、创建及编辑初始化文件

初始化文件保存在home目录(自己的个人目录)中

14.10 shell脚本注释

以一个#(井号)字符开头的行称为注释。

14.11 Bourne shell家族: 初始化文件示例

参见: P301

14.12 C-Shell家族: 初始化文件示例

参见: P303

posted on 2019-09-10 14:02  青苹末末  阅读(142)  评论(0编辑  收藏  举报

导航