這裡敘述了一些命令提示字串的進階用法,讓您可以自訂一些更特別的命令提示字串。

在上一篇命令提示字串的基本教學中,我們介紹了一些最基本的命令提示字串設定方式,以下我們再進一步說明如何利用 tput 來控制文字樣式,另外也蒐集了許多好用的範例,如果不想自己慢慢自訂命令提示字串的人,可以從這裡找一個自己喜歡的來使用。

使用 tput 控制文字樣式

tput 指令也可以用來控制命令提示字串,除了顏色之外,他還可以控制文字的樣式,例如粗體與下底線等:

PS1="\[$(tput bold)$(tput setb 4)$(tput setaf 7)\]\u@\h:\w $ \[$(tput sgr0)\]"

linux-bash-prompt-2-1

以下是 tput 控制顏色的用法:

  • tput setb [1-7]:設定背景顏色。
  • tput setab [1-7]:使用 ANSI escape code 設定背景顏色。
  • tput setf [1-7]:設定前景顏色。
  • tput setaf [1-7]:使用 ANSI escape code 設定前景顏色。

以下這個指令稿可以顯示出所有前景與背景的顏色差異:

#!/bin/bash
for i in {1..7}; do
  echo "$(tput setab $i)setab $i$(tput sgr0)\
  $(tput setb $i)setb $i$(tput sgr0)\
  $(tput setaf $i)setaf $i$(tput sgr0)\
  $(tput setf $i)setf $i$(tput sgr0)"
done

結果會像這樣:

tput-demo-1

用於控制文字樣式的語法:

  • tput bold:進入粗體模式。
  • tput dim:進入低亮度(half-bright)模式。
  • tput smul:進入下底線模式。
  • tput rmul:結束下底線模式。
  • tput rev:開始反相模式。
  • tput smso:進入 standout 模式。
  • tput rmso:結束 standout 模式。
  • tput sgr0:結束所有的模式。

這是這幾種文字樣式的簡單示範:

tput-demo-2

範例

以下我們蒐集許多很有用的、或是很有趣的命令提示字串範例程式碼,您可以從這些範例來修改,創造出屬於自己的命令提示字串。

五顏六色的命令提示字串

PS1='\[\e[1;36m\]\d \[\e[1;32m\]\t \[\e[1;33m\]\u@\[\e[1;35m\]\h:\w\$\[\e[0;31m\] '

linux-bash-prompt-2-2

多行的命令提示字串

PS1='\[\e[1;33m\]\u@\h \w ->\n\[\e[1;36m\] \@ \d\$\[\e[m\] '

linux-bash-prompt-2-3

判斷是否為 root 帳號

依據是否為 root 帳號來選擇命令提示字串:

if [ $(id -u) -eq 0 ];
then
    PS1='\[\e[1;36m\][\d \t \u@\h \w]\$\[\e[m\] '
else
    PS1='\[\e[1;33m\][\d \t \u@\h \w]\$\[\e[m\] '
fi

一般使用者的狀況:

linux-bash-prompt-2-4

root 管理者的狀況:

linux-bash-prompt-2-5

您可以將 root 使用者的命令提示字串設定成比較醒目的顏色,這樣可以讓自己很容易辨識出是否正在使用 root 權限執行指令,降低下錯指令的風險。

使用 fortunecowsay

.bashrc 中加入下面這行,可以在每次開啟終端機時,顯示一些有趣的內容:

[[ "$PS1" ]] && /usr/games/fortune | /usr/games/cowsay -n

linux-bash-prompt-2-6

判斷指令執行結果

這個命令提示字串可以依照上一個指令的執行結果來顯示不同的樣式:

PS1="\`if [ \$? = 0 ]; then echo \[\e[33m\]^_^\[\e[0m\]; else echo \[\e[31m\]O_O\[\e[0m\]; fi\`[\u@\h:\w]\\$ "

linux-bash-prompt-2-7

依據指令的執行結果改變顏色:

PS1="\[\033[0;33m\][\!]\`if [[ \$? = "0" ]]; then echo "\\[\\033[32m\\]"; else echo "\\[\\033[31m\\]"; fi\`[\u.\h: \`if [[ `pwd|wc -c|tr -d " "` > 18 ]]; then echo "\\W"; else echo "\\w"; fi\`]\$\[\033[0m\] "; echo -ne "\033]0;`hostname -s`:`pwd`\007"

linux-bash-prompt-2-8

顯示目前目錄的檔案數量與大小

很實用的多行指令,可以顯示目前目錄的檔案數量與大小:

PS1="\n\[\033[35m\]\$(/bin/date)\n\[\033[32m\]\w\n\[\033[1;31m\]\u@\h: \[\033[1;34m\]\$(/usr/bin/tty | /bin/sed -e 's:/dev/::'): \[\033[1;36m\]\$(/bin/ls -1 | /usr/bin/wc -l | /bin/sed 's: ::g') files \[\033[1;33m\]\$(/bin/ls -lah | /bin/grep -m 1 total | /bin/sed 's/total //')b\[\033[0m\] -> \[\033[0m\]"

linux-bash-prompt-2-9

用顏色區分各種基本資訊

PS1="\[\033[35m\]\t\[\033[m\]-\[\033[36m\]\u\[\033[m\]@\[\033[32m\]\h:\[\033[33;1m\]\w\[\033[m\]\$ "

linux-bash-prompt-2-10

顯示完整路徑

PS1="[\[\033[32m\]\w]\[\033[0m\]\n\[\033[1;36m\]\u\[\033[1;33m\]-> \[\033[0m\]"

linux-bash-prompt-2-11

顯示背景工作數量

PS1='\[\e[1;32m\]\u@\H:\[\e[m\] \[\e[1;37m\]\w\[\e[m\]\n\[\e[1;33m\]hist:\! \[\e[0;33m\] \[\e[1;31m\]jobs:\j \$\[\e[m\] '

linux-bash-prompt-2-12