Shell提示符:#和$

2020-07-16 10:04:31
啟動終端模擬包或者從 Linux 控制台登入後,便可以看到 Shell 提示符。提示符是通往 Shell 的大門,是輸入 Shell 命令的地方。

對於普通使用者,Base shell 預設的提示符是美元符號$;對於超級使用者(root 使用者),Bash Shell 預設的提示符是井號#該符號表示 Shell 等待輸入命令。

不同的 Linux 發行版使用的提示符格式不同。例如在 CentOS 中,預設的提示符格式為:

[[email protected] ~]$

這種格式包含了以下三個方面的資訊:
  • 啟動 Shell 的使用者名稱,也即 mozhiyan;
  • 本地主機名稱,也即 localhost;
  • 當前目錄,波浪號~是主目錄的簡寫表示法。

Shell 通過PS1PS2兩個環境變數來控制提示符格式:
  • PS1 控制最外層命令列的提示符格式。
  • PS2 控制第二層命令列的提示符格式。

在 Shell 中初次輸入命令,使用的是 PS1 指定的提示符格式;如果輸入一個命令後還需要輸入附加資訊,Shell 就使用 PS2 指定的提示符格式。請看下面的例子:
[[email protected] ~]$ echo "C語言中文網"
C語言中文網
[[email protected] ~]$ echo "http://c.biancheng.net"
http://c.biancheng.net
[[email protected] ~]$ echo "
> yan
> chang
> sheng
> "

yan
chang
sheng

[[email protected] ~]$ 
echo 是一個輸出命令,可以用來輸出數位、變數、字串等;本例中,我們使用 echo 來輸出字串。

字串是一組由" "包圍起來的字元序列,echo 將第一個"作為字串的開端,將第二個"作為字串的結尾。此處的字串就可以看做 echo 命令的附加資訊。

本例中,前兩次使用 echo 命令時都是在後面緊跟字串,一行之內輸入了完整的附加資訊。第三次使用 echo 時,將字串分成多行,echo 遇到第一個"認為是不完整的附加資訊,所以會繼續等待使用者輸入,直到遇見第二個"。輸入的附加資訊就是第二層命令,所以使用>作為提示符。

要顯示提示符的當前格式,可以使用 echo 輸出 PS1 和 PS2:
[[email protected] ~]$ echo $PS1
[[email protected] W]$
[[email protected] ~]$ echo $PS2
>
[[email protected] ~]$ 
Shell 使用以為前導的特殊字元來表示命令提示字元中包含的要素,這使得 PS1 和 PS2 的格式看起來可能有點奇怪。下表展示了可以在 PS1 和 PS2 中使用的特殊字元。
Bash shell 提示符可以包含的要素
字元 描述
a 鈴聲字元
d 格式為“日 月 年”的日期
e ASCII跳脫字元
h 本地主機名
H 完全合格的限定域主機名
j shell當前管理的作業數
1 shell終端裝置名的基本名稱
n ASCII換行字元
r ASCII回車
s shell的名稱
t 格式為“小時:分鐘:秒”的24小時製的當前時間
T 格式為“小時:分鐘:秒”的12小時製的當前時間
@ 格式為am/pm的12小時製的當前時間
u 當前使用者的使用者名稱
v bash shell的版本
V bash shell的發布級別
w 當前工作目錄
W 當前工作目錄的基本名稱
! 該命令的bash shell歷史數
# 該命令的命令數量
$ 如果是普通使用者,則為美元符號$;如果超級使用者(root 使用者),則為井號#
nnn 對應於八進位制值 nnn 的字元
斜槓
[ 控制碼序列的開頭
] 控制碼序列的結尾

注意,所有的特殊字元均以反斜槓開頭,目的是與普通字元區分開來。您可以在命令提示字元中使用以上任何特殊字元的組合。

我們可以通過修改 PS1 變數來修改提示符格式,例如:
[[email protected] ~]$ PS1="[t][u]$ "
[17:27:34][mozhiyan]$ 
新的 Shell 提示符現在可以顯示當前的時間和使用者名稱。不過這個新定義的 PS1 變數只在當前 Shell 對談期間有效,再次啟動 Shell 時將重新使用預設的提示符格式。