在这一章中,我们将会看一下表面上看来很琐碎的细节-shell 提示符。但这会揭示一些 shell 和 终端仿真器的内部工作方式。
和 linux 内的许多程序一样,shell 提示符是可高度配置的,虽然我们把它相当多地看作是理所当然的, 但是我们一旦学会了怎样控制它,shell 提示符是一个相当有用的工具。
我们默认的提示符看起来像这样:
[me@linuxbox ~]$
注意它包含我们的用户名,主机名和当前工作目录,但是它又是怎样得到这些东西的呢? 结果证明非常简单。提示符是由一个环境变量定义的,叫做 PS1(是“prompt string one” 的简写)。我们可以通过 echo 命令来查看 PS1的内容。
[me@linuxbox ~]$ echo $PS1 [\u@h W]$
注意:如果你 shell 提示符的内容和上例不是一模一样,也不必担心。每个 Linux 发行版 定义的提示符稍微有点不同,其中一些相当异于寻常。
从输出结果中,我们看到那个 PS1 环境变量包含一些这样的字符,比方说中括号,@符号,和美元符号, 但是剩余部分就是个谜。我们中一些机敏的人会把这些看作是由反斜杠转义的特殊字符,就像我们 在第八章中看到的一样。这里是一部分字符列表,在提示符中 shell 会特殊对待这些字符:
参照这个特殊字符列表,我们可以更改提示符来看一下效果。首先, 我们把原来提示符字符串的内容备份一下,以备之后恢复原貌。为了完成备份, 我们把已有的字符串复制到另一个 shell 变量中,这个变量是我们自己创造的。
[me@linuxbox ~]$ ps1_old="$PS1"
我们新创建了一个叫做 ps1_old 的变量,并把变量 PS1的值赋 ps1_old。通过 echo 命令可以证明 我们的确复制了 PS1的值。
[me@linuxbox ~]$ echo $ps1_old [\u@h W]$
在终端会话中,我们能在任一时间复原提示符,只要简单地反向操作就可以了。
[me@linuxbox ~]$ PS1="$ps1_old"
现在,我们准备开始,让我们看看如果有一个空的字符串会发生什么:
[me@linuxbox ~]$ PS1=
如果我们没有给提示字符串赋值,那么我们什么也得不到。根本没有提示字符串!提示符仍然在那里, 但是什么也不显示,正如我们所要求的那样。我们将用一个最小的提示符来代替它:
PS1="$ "
这样要好一些。至少能看到我们在做什么。注意双引号中末尾的空格。当提示符显示的时候, 这个空格把美元符号和光标分离开。
在提示符中添加一个响铃:
$ PS1="a$ "
现在每次提示符显示的时候,我们应该能听到嗡嗡声。这会变得很烦人,但是它可能会 很有用,特别是当一个需要运行很长时间的命令执行完后,我们要得到通知。
下一步,让我们试着创建一个信息丰富的提示符,包含主机名和当天时间的信息。
$ PS1="A h $ " 17:33 linuxbox $
试试其他上表中列出的转义序列,看看你能否想出精彩的新提示符。