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

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

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

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

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

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

設(shè)置前后效果
如果就這么簡(jiǎn)單,那么張戈就不是張戈了。
服務(wù)器那么多,如果一臺(tái)一臺(tái)你慢慢找IP地址,然后慢慢設(shè)置,那就太慢了。而且就算你設(shè)置好,不知道什么時(shí)候IP地址就變了,你還得修改。所以張戈寫了一個(gè)據(jù)說很簡(jiǎn)單,但我覺得還是很復(fù)雜的Shell腳本,來(lái)幫我們實(shí)現(xiàn)這個(gè)效果。
#!/bin/sh
#########################################################################
# Update PS1 like [root@192.168.1.113 /data]# #
#########################################################################
#先判斷網(wǎng)卡是否存在,我這邊eth1是內(nèi)網(wǎng)網(wǎng)卡
ifconfig eth1 >/dev/null 2>&1
if [[ $? != 0 ]]
then
echo 'interface eth1 not exsit!';
exit 1
fi
#Centos/Redhat 7 ifconfig顯示的結(jié)果不是 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
#有的用戶可能會(huì)在家目錄下自定義一些配置,即 .proflie這個(gè)隱藏文件,所以也需要更新
test -f $home/.profile && (
sed -i '/export PS1=/d' $home/.profile
Export $home/.profile
)
}
#獲取當(dāng)前用戶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、張戈將變量寫進(jìn)的是/etc/profile中,而不是我試用的~/.bashrc中。
2、修改腳本中的網(wǎng)卡,張戈是eth1,而我是eth0 。如果不修改直接運(yùn)行的話,可能會(huì)直接被退出終端。所以使用以下命令替換eth1為自己的網(wǎng)卡名稱:
sed -i 's/eth1/eth0/g' update_PS1.sh
運(yùn)行腳本的方式,是
source ./update_PS1.sh

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

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

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

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

川公網(wǎng)安備 51011202000104號(hào)
前來(lái)支持,太專業(yè),看不懂,只有膜拜之!!!
完全看不懂 太深?yuàn)W了
哎呀,又是亂碼。能搞個(gè)正面高清無(wú)碼的嗎?!
顯示ip有點(diǎn)簡(jiǎn)單, 沒有考慮到所登錄的機(jī)器為多ip網(wǎng)關(guān)的情況。我的腳本如果登錄機(jī)器有多ip,會(huì)都在提示符上顯示出來(lái)。
另外很多不同linux版本,ifconfig輸出格式都不太一樣,這個(gè)也是需要增強(qiáng)。