Linux增加命令識別度的PS1命令提示符格式設置
編輯:狂族晨曦 來源:腳本編程,系統運維,經驗雜筆 日期:2016-09-01 閱讀: 4,620 次 4 條評論 » 百度已收錄
我始終覺得,在Xshell中ssh連接服務器,敲了很多命令,想要回去查看直接命令的結果的時候,一行一行的命令容易看花眼,不能準確的在一行行命令中,找到輸入命令的那一行。

代碼看花了眼
在搜教程的時候,我無意間看到一個教程中的終端截圖了,別人的命令提示符“#”號是紅色的,我頓時眼前一亮,我覺得這樣的識別度就比較高了。但是當時不知道這是怎么實現的,還以為是Xshell的配置,還在顏色配置中找了半天,無果后只能暫時放棄。

紅色提示符
后來終于找到了設置方法,原來是linux的終端命令提示符的變量PS1。
初階用法
其實PS1就是用來設置命令提示符格式的環境變量。
我的設置方法是,在~/.bashrc末尾添加PS1的變量,再刷新一下就可以了。也可以在/etc/profile中添加。
vim ~/.bashrc PS1="[\u@\h \W]\[\e[31;40m\]\\$ \[\e[0m" #末尾添加 source ~/.bashrc # 刷新
這個變量初看是不怎么看的懂的,但是它的規則其實也很簡單。
下面是需要顯示的信息代碼:
\d :代表日期,格式為weekday month date,例如:"Mon Aug 1" \H :完整的主機名稱。例如:我的機器名稱為:fc4.linux,則這個名稱就是fc4.linux \h :僅取主機的第一個名字,如上例,則為fc4,.linux則被省略 \t :顯示時間為24小時格式,如:HH:MM:SS \T :顯示時間為12小時格式 \A :顯示時間為24小時格式:HH:MM \u :當前用戶的賬號名稱 \v :BASH的版本信息 \w :完整的工作目錄名稱。家目錄會以 ~代替 \W :利用basename取得工作目錄名稱,所以只會列出最后一個目錄 \# :下達的第幾個命令 \$ :提示字符,如果是root時,提示符為:# ,普通用戶則為:$
下面是設置這些代碼顏色的代碼:
前景 背景 顏色 ----------------------------- 30 40 黑色 31 41 紅色 32 42 綠色 33 43 黃色 34 44 藍色 35 45 紫紅色 36 46 青藍色 37 47 白色
我配置的很簡單,就是增加了一個 # 號為紅色:
PS1="[\u@\h \W]\[\e[31;40m\]\\$ \[\e[0m"
其實背景色可以不用設置,那么就是這樣:
PS1="[\u@\h \W]\[\e[31m\]\\$ \[\e[0m"
效果如下:

展示效果
實際上還有很多自定義的樣式,比如:
PS1="\[\e[37;40m\][\[\e[32;40m\]\u\[\e[37;40m\]@\h \[\e[35;40m\]\W\[\e[0m\]]\\$ "
效果如下:

其他樣式
由上面兩個案例其實可以看出,設置顏色的方式,是在顯示信息代碼的前面加上“\[\e[37;40m\]”的代碼,其中的數字就是前景色和背景色的數值。
搞明白了規則,那么可以愉快的DIY了

各種樣式
高階用法
如果說上面只是初階用法的話,那么下面從張戈博客那里看到的用法可以稱的上為高階用法,可以避免很多生產環境中的錯誤。
在生產環境中,我們運維工程師手底下隨隨便便可能就有成百上千臺的服務器, 連先森都有數十臺。而連接這些服務器一般都是用跳板機,由于這些機器一般都是克隆或者虛擬化出來的,所以登陸后的命令行提示符幾乎是一個模子刻出來的,比如都是:[root@localhost ~]#
所以為了更好的區別服務器,張戈提出了優化PS1的方式,讓命令提示符中囊括當前服務器的IP地址,以及當前路徑。
設置的PS1代碼如下:
export PS1='\[\e[32m\][\u@192.168.1.1:\[\e[m\]\[\e[33m\]\w\[\e[m\]\[\e[32m\]]\[\e[m\]\$ '
前后效果如下:

設置前后效果
如果就這么簡單,那么張戈就不是張戈了。
服務器那么多,如果一臺一臺你慢慢找IP地址,然后慢慢設置,那就太慢了。而且就算你設置好,不知道什么時候IP地址就變了,你還得修改。所以張戈寫了一個據說很簡單,但我覺得還是很復雜的Shell腳本,來幫我們實現這個效果。
#!/bin/sh
#########################################################################
# Update PS1 like [root@192.168.1.113 /data]# #
#########################################################################
#先判斷網卡是否存在,我這邊eth1是內網網卡
ifconfig eth1 >/dev/null 2>&1
if [[ $? != 0 ]]
then
echo 'interface eth1 not exsit!';
exit 1
fi
#Centos/Redhat 7 ifconfig顯示的結果不是 inet addr: 而是 inet 直接加IP,所以這里需要判斷下:
function Get_eth1IP()
{
if [[ $1 -eq 7 ]]
then
#for centos 7
eth1_IP=$(ifconfig eth1 |awk '/inet / {print $2}'|awk '{print $1}')
else
eth1_IP=$(ifconfig eth1 |awk -F":" '/inet addr:/ {print $2}'|awk '{print $1}')
fi
}
test -f /etc/redhat-release && grep 7 /etc/redhat-release >/dev/null 2>&1 && Get_eth1IP 7
test -f /etc/centos-release && grep 7 /etc/redhat-release >/dev/null 2>&1 && Get_eth1IP 7 || Get_eth1IP
echo $eth1_IP | grep -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" >/dev/null 2>&1
if [[ $? != 0 ]]
then
echo 'eth1_IP is empty!'
exit 1
fi
function Export()
{
echo "export PS1='\[\e[32m\][\u@${eth1_IP}:\[\e[m\]\[\e[33m\]\w\[\e[m\]\[\e[32m\]]\[\e[m\]\\$ '">>${1} && \
echo -e "\033[32m Update \033[0m \033[33m${1}\033[33m \033[32mSuccess! Please relogin your system for refresh... \033[0m"
}
function home_env()
{
if [[ ! -z $1 ]]
then
home=$1
else
home=/root
fi
#有的用戶可能會在家目錄下自定義一些配置,即 .proflie這個隱藏文件,所以也需要更新
test -f $home/.profile && (
sed -i '/export PS1=/d' $home/.profile
Export $home/.profile
)
}
#獲取當前用戶id,如果是root組的則可以操作/etc/profile
userid=$(id | awk '{print $1}' | sed -e 's/=/ /' -e 's/(/ /' -e 's/)/ /'|awk '{print $2}')
if [[ $userid = 0 ]]
then
#for all
sed -i '/export PS1=/d' /etc/profile
Export /etc/profile
#for root
home_env
#如果其他用戶需要修改,只要開啟一下三行,并將other修改成用戶名
#id other >/dev/null 2>&1 && (
# home_env ~other
#)
else
#for userself
home_env ~
fi
注意:
1、張戈將變量寫進的是/etc/profile中,而不是我試用的~/.bashrc中。
2、修改腳本中的網卡,張戈是eth1,而我是eth0 。如果不修改直接運行的話,可能會直接被退出終端。所以使用以下命令替換eth1為自己的網卡名稱:
sed -i 's/eth1/eth0/g' update_PS1.sh
運行腳本的方式,是
source ./update_PS1.sh

運行腳本
接著,重新登錄或者
source /etc/profile
就可以看到效果了:

刷新變量
如果你覺得這樣兩步實現麻煩,可以在腳本最后添加一行source /etc/profile 即可立即見效:

一步見效
但是我覺得這種樣式顏色有點單調,所以做了兩種改變格式:

樣式改變
PS1的樣式代碼就不用說了,都是在張戈的基礎上修改一下。怎樣設置,就看個人喜好了。
歷史上的今天:
- 2015: 2015.8.31我校舉行新學期升國旗儀式(0)
- 2015: 福利:移動9月近3G流量免費領(0)
- 2015: WordPress回復評論自動添加@評論者(0)
轉載請注明出處來自http://www.cnidcc.cn/linux_ps1.html

川公網安備 51011202000104號
前來支持,太專業,看不懂,只有膜拜之!!!
完全看不懂 太深奧了
哎呀,又是亂碼。能搞個正面高清無碼的嗎?!
顯示ip有點簡單, 沒有考慮到所登錄的機器為多ip網關的情況。我的腳本如果登錄機器有多ip,會都在提示符上顯示出來。
另外很多不同linux版本,ifconfig輸出格式都不太一樣,這個也是需要增強。