歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux操作系統:BASH命令提示符改造

Linux操作系統:BASH命令提示符改造

日期:2017/2/25 10:36:58   编辑:Linux教程

Linux操作系統:BASH命令提示符改造

用過linux下terminal的人對這樣的命令提示符都不會感到陌生

  這樣的提示符本沒什麼問題,特別是多用戶狀態下,還能清楚地知道自己的用戶名的主機。

  但是,它有一個毛病,那就是把目錄同時顯示了出來,有時候目錄過長的時候,占用了整行,讓人很郁悶,比如

  當然,在多用戶遠程終端下,用戶名,主機,用當前目錄都是很重要的,怎樣合適取決於你個人的需要。

  現在我的需要是在單用戶的gnome-terminal下對命令提示符進行改造。用戶名和主機根本就不需要提示,或者干脆將其連同當前目錄顯示在gnome-terminal的標題欄上。另外,還可以加一些其它的特性和顏色。

  現以ubuntu10.04系統為例!

  首先,對命令提示符(prompting)進行改造之前,要清楚是什麼東西在對它進行控制。看一下幫助(man bash), 搜一下prompt,一下子就看到了這樣幾個變量,PS1, PS2, PS3, PS4。再看一下當前系統變量中有沒有這幾個變量,echo $PS1, echo $PS2, echo $PS4這三個在我的系統裡是有的。

  echo $PS1的結果是

  \[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$

  echo $PS2的結果是

  >

  echo $PS4的結果是

  +

  容易看出來,PS1就是用來控制當前命令提示符的,而PS2則用來控制命令沒有輸完就換行的情況下的提示符。這裡我們只關心PS1,這個字符串由許多轉義字符組成,這些轉義字符表示什麼意思,可以查看info bash。

  有幾個轉義字符是比較明顯的,\u表示user, \h表示hostname, \w表示當前目錄(將用戶主目錄縮寫成~)。

  再看一下${debian_chroot:+($debian_chroot)},查了一下,這是一個條件賦值。如果系統中有 debian_chroot變量,那麼就會加上($debian_chroot),比如我在~/.bashrc中加上export debian_chroot="AAA",那麼,我的命令提示符會變成

  (AAA)user@hostname-laptop~$

  debian_chroot和/etc/debian_chroot文件有關,而我的系統下既沒有這個文件,debian_chroot變量又沒有定義,因此,這一項我可以無視。

  info bash中告訴我們,\[和\]是一對限定符,用來限定一些非打印字符。其潛在意思沒有說出來,既然是非打印字符,為什麼要限定呢?反正又不會顯示。其實不限定一下是會出問題的,因為這些非打印字符會造成命令提示符的混亂。比如從vim退出來時,或者用方向鍵查看命令歷史記錄時,會出現一些不友好的狀況。因此,這一對限定符的作用在於,終端在決定命令提示符寬度的時候,完全忽略這些非打印字符,同時,它又不會影響這些非打印字符的功能。

  另外,它還有一層意思,那就是,非打印字符必須要放在這一對限定符中間。

  知道了這一點之後,就剩下\e]0;\u@\h: \w\a 這一串符號了。

  \e]0;titlebar\a會標題欄上顯示titlebar,即\e]0;和\a及之間的字符構成一個非打印序列,它的作用是將這些字符顯示在gnome-terminal的標題欄上。

  \e的ASCII碼是033,它還有一個重要作用是顏色的設定。如果用終端上過BBS的人應該知道這個東西,終端上的顏色都是通過它來控制的。

  具體來說,控制當前顏色的命令置於\e[和m之間,中間有一些用分號隔開的數字。比如

  \e[32;1m表示亮綠色。

  其中32表示顏色,1表示顏色的深淺。另外,\e[0m表示恢復原狀,後面的文字將不受前面顏色的影響。

  因此,修改後的設置應該是

  export PS1="\[\e]0;\u@\h: \w\a\e[32;1m\]\$\[\e[0m\] "

  注意,前後各有兩個非打印字符序列。

  另外,有時候,知道前一個程序運行的結果代碼也很有用,其代碼是$?,因此,上面的設置又可以改成

  export PS1="\[\e]0;\u@\h: \w\a\e[32;1m\]$?\$\[\e[0m\] "

  因此,每個顏色控制可以由三個數字來控制,比如\e[31;45;5m表示閃爍紅字粉底。當然,對閃爍的支持需要有特定的終端。對於gnome-terminal來說,命令

  printf "\e[31;45;5mABC"

  就不會有閃爍的效果,但顏色是有的。

  上面只是給出了ASCII碼控制命令中的顏色控制,在實際應用中,比如BBS的終端顯示,還涉及到許多其它的控制命令,比如清除屏幕,設置光標等等。具體可以參考一些BBS站的相關版面,比如bdwm的asciiart版, 水木的asciiart版。

Copyright © Linux教程網 All Rights Reserved