成航先森 成航先森

成都航院计算机系一个学生的个人博客

 

脚本编程

  • 没有分类目录

最新文章

脚本编程
当前位置: 首页 » 脚本编程 » Linux增加命令识别度的PS1命令提示符格式设置

Linux增加命令识别度的PS1命令提示符格式设置

编辑:狂族晨曦 来源:脚本编程系统运维经验杂笔 日期:2016-09-01 阅读: 4,002 次 4 条评论 » 百度已收录

最后更新时间:2022-04-02

我始终觉得,在Xshell中ssh连接服务器,敲了很多命令,想要回去查看直接命令的结果的时候,一行一行的命令容易看花眼,不能准确的在一行行命令中,找到输入命令的那一行。

看花眼.png -1

代码看花了眼

在搜教程的时候,我无意间看到一个教程中的终端截图了,别人的命令提示符“#”号是红色的,我顿时眼前一亮,我觉得这样的识别度就比较高了。但是当时不知道这是怎么实现的,还以为是Xshell的配置,还在颜色配置中找了半天,无果后只能暂时放弃。

加红色.png -2

红色提示符

后来终于找到了设置方法,原来是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"

效果如下:

效果展示.png -3

展示效果

实际上还有很多自定义的样式,比如:

PS1="\[\e[37;40m\][\[\e[32;40m\]\u\[\e[37;40m\]@\h \[\e[35;40m\]\W\[\e[0m\]]\\$ "

效果如下:

其他样式.png -4

其他样式

由上面两个案例其实可以看出,设置颜色的方式,是在显示信息代码的前面加上“\[\e[37;40m\]”的代码,其中的数字就是前景色和背景色的数值。

搞明白了规则,那么可以愉快的DIY了

展示.png -5

各种样式

高阶用法

如果说上面只是初阶用法的话,那么下面从张戈博客那里看到的用法可以称的上为高阶用法,可以避免很多生产环境中的错误。

在生产环境中,我们运维工程师手底下随随便便可能就有成百上千台的服务器, 连先森都有数十台。而连接这些服务器一般都是用跳板机,由于这些机器一般都是克隆或者虚拟化出来的,所以登陆后的命令行提示符几乎是一个模子刻出来的,比如都是:[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\]\$ '

前后效果如下:

设置前后.png -6

设置前后效果

如果就这么简单,那么张戈就不是张戈了。

服务器那么多,如果一台一台你慢慢找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 sh.png -7

运行脚本

接着,重新登录或者

source /etc/profile

就可以看到效果了:

source效果.png -8

刷新变量

如果你觉得这样两步实现麻烦,可以在脚本最后添加一行source /etc/profile 即可立即见效:

添加一行.png -9

一步见效

但是我觉得这种样式颜色有点单调,所以做了两种改变格式:

改进.png -10

样式改变

PS1的样式代码就不用说了,都是在张戈的基础上修改一下。怎样设置,就看个人喜好了。

历史上的今天:

标签:
除特别注明外,本站所有文章均为成航先森 www.capjsj.cn 原创,本文共4154个字
转载请注明出处来自https://www.capjsj.cn/linux_ps1.html
已有 4 位"计工"发布了激烈的评论,还有N多人围观笑而不语评论
的头像
欢迎发表评论
取消评论

表情
疑问调皮伤心抠鼻黑线微笑可爱奸笑震惊吓到了撇嘴大兵忍不住笑笑狂骂狂怒噢?鼓掌酷⊙﹏⊙b汗鄙视大哭嘿嘿

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. 的头像

    前来支持,太专业,看不懂,只有膜拜之!!!

    2016-09-01 14:14 回复
  2. 完全看不懂 太深奥了

    2016-09-01 14:59 回复
  3. 的头像

    哎呀,又是乱码。能搞个正面高清无码的吗?!

    2016-09-01 15:08 回复
  4. 的头像
    阿克:

    显示ip有点简单, 没有考虑到所登录的机器为多ip网关的情况。我的脚本如果登录机器有多ip,会都在提示符上显示出来。
    另外很多不同linux版本,ifconfig输出格式都不太一样,这个也是需要增强。

    2021-03-24 00:14 回复
官方微信
发表评论 返回顶部