Linux增加命令识别度的PS1命令提示符格式设置
编辑:狂族晨曦 来源:脚本编程,系统运维,经验杂笔 日期:2016-09-01 阅读: 4,141 次 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)
转载请注明出处来自https://www.capjsj.cn/linux_ps1.html
前来支持,太专业,看不懂,只有膜拜之!!!
完全看不懂 太深奥了
哎呀,又是乱码。能搞个正面高清无码的吗?!
显示ip有点简单, 没有考虑到所登录的机器为多ip网关的情况。我的脚本如果登录机器有多ip,会都在提示符上显示出来。
另外很多不同linux版本,ifconfig输出格式都不太一样,这个也是需要增强。