在這一章中,我們將會看一下表面上看來很瑣碎的細節-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 $
試試其他上表中列出的轉義序列,看看你能否想出精彩的新提示符。