如何让 Shell 提示符更酷炫

2023-05-16

使用远程终端时,默认的命令行提示符格式已经能满足大部分用户需求了,但有时我们希望提示符看起来更直观、优雅、酷炫、美观,可以从中直接得到我们想要的信息,而且清晰分明。本文就详细讲解一下如何让 Shell 提示符更酷炫,一起来学习一下吧!

效果

闲话少说,先上效果!

export PS1="[\e[35m\u@\e[32m\h \e[33m\W\e[0m]$ "
echo
export PS1="[\e[1;4;37;42m\u@\e[31m\h\e[0m \e[5;33;47m\W\e[0m]$ "
echo
export PS1="[\e[1;4;37;42m\u@\e[7;31m\h\e[0m \e[5;33;47m\W\e[0m]$ "
echo
export PS1="[\e[1;3;4;5;37m\u@\h\e[0m \W\e[0m]$ "
echo
export PS1="[\e[1;21;37m\u@\h\e[0m \W\e[0m]$ "
echo

在这里插入图片描述

Shell 酷炫提示符动态效果1

[root@natnet-source ~]$ cat test_csi.sh 
#!/bin/bash
test_echo() {
        echo -e "$1"
        echo
}

# test CSI 1..9
for i in `seq 1 9`;
do
        echo "CSI $i" 
        test_echo "[\e[$i;32m${USER}@${HOSTNAME} ${PWD}]\\\$ "
done

# test combination
test_echo "[\e[35m${USER}@\e[32m\${HOSTNAME} \e[33m${PWD}\e[0m]\$ "
test_echo "[\e[1;4;37;42m${USER}@\e[31m${HOSTNAME}\e[0m \e[5;33;47m${PWD}\e[0m]\\$ "
test_echo "[\e[1;4;37;42m${USER}@\e[7;31m${HOSTNAME}\e[0m \e[5;33;47m${PWD}\e[0m]\\$ "
test_echo "[\e[1;3;4;5;37m${USER}@${HOSTNAME}\e[0m ${PWD}\e[0m]\\$ "
test_echo "[\e[1;21;37m${USER}@${HOSTNAME}\e[0m ${PWD}\e[0m]\\$ "

在这里插入图片描述

Shell 酷炫提示符动态效果2

注意
测试 Shell 提示符显示效果时建议使用echo命令。
使用export PS1=直接修改PS1时,与history功能使用 方向键上、下 查看历史命令配合使用有 Bug (也有可能时学艺不精,没空深挖终端的控制序列,且因过时了意义不大),在遇到形如export PS1=的历史命令时会残留这部分字符串,具体如下所示:
在这里插入图片描述

知识

这种操作大类上属于 终端控制 ,修改 Shell 提示符字体和颜色的功能属于控制序列引入的一种功能。我参考了 XTerm Control Sequences 。因在如今详细学习它意义不大,所以笔者这里仅挑选与本文主旨相关的重要的讲解。

控制(Controls) 的参数:

  • C :单个(必须的)字符。
  • Ps :一个(通常是可选的)数字参数,由一个或多个数字组成。
  • Pm :任意数量的单个数字参数 Ps ,以;字符分隔。
  • Pt :由可打印字符组成的文本参数。

名词解释

ECMA-48(又名 “ISO 6429”)
记录了 C0(7位)C1(8位) 代码。
C0
代码 0 至 31 。
C1
代码 128 至 159 。
ESC (Escape)
跳脱字符,又叫转义字符。ASCII 码十进制为 27 ,八进制为 \033 ,十六进制为 \0x1b ,某些时候也可以使用 \e 表示。
CSI (Control Sequence Introducer)
ESC [ (CSI 是 0x9b) ,如上所述,其变种形式为 \e[\033[
CSI Pm m Character Attributes (SGR)
     Ps = 0  ⇒  Normal (default), VT100.
     Ps = 1  ⇒  Bold, VT100.
     Ps = 2  ⇒  Faint, decreased intensity, ECMA-48 2nd.
     Ps = 3  ⇒  Italicized, ECMA-48 2nd.
     Ps = 4  ⇒  Underlined, VT100.
     Ps = 5  ⇒  Blink, VT100.
   This appears as Bold in X11R6 xterm.
     Ps = 7  ⇒  Inverse, VT100.
     Ps = 8  ⇒  Invisible, i.e., hidden, ECMA-48 2nd, VT300.
     Ps = 9  ⇒  Crossed-out characters, ECMA-48 3rd.
     Ps = 2 1  ⇒  Doubly-underlined, ECMA-48 3rd.
     Ps = 2 2  ⇒  Normal (neither bold nor faint), ECMA-48 3rd.
     Ps = 2 3  ⇒  Not italicized, ECMA-48 3rd.
     Ps = 2 4  ⇒  Not underlined, ECMA-48 3rd.
     Ps = 2 5  ⇒  Steady (not blinking), ECMA-48 3rd.
     Ps = 2 7  ⇒  Positive (not inverse), ECMA-48 3rd.
     Ps = 2 8  ⇒  Visible, i.e., not hidden, ECMA-48 3rd, VT300.
     Ps = 2 9  ⇒  Not crossed-out, ECMA-48 3rd.
     Ps = 3 0  ⇒  Set foreground color to Black.
     Ps = 3 1  ⇒  Set foreground color to Red.
     Ps = 3 2  ⇒  Set foreground color to Green.
     Ps = 3 3  ⇒  Set foreground color to Yellow.
     Ps = 3 4  ⇒  Set foreground color to Blue.
     Ps = 3 5  ⇒  Set foreground color to Magenta.
     Ps = 3 6  ⇒  Set foreground color to Cyan.
     Ps = 3 7  ⇒  Set foreground color to White.
     Ps = 3 9  ⇒  Set foreground color to default, ECMA-48 3rd.
     Ps = 4 0  ⇒  Set background color to Black.
     Ps = 4 1  ⇒  Set background color to Red.
     Ps = 4 2  ⇒  Set background color to Green.
     Ps = 4 3  ⇒  Set background color to Yellow.
     Ps = 4 4  ⇒  Set background color to Blue.
     Ps = 4 5  ⇒  Set background color to Magenta.
     Ps = 4 6  ⇒  Set background color to Cyan.
     Ps = 4 7  ⇒  Set background color to White.
     Ps = 4 9  ⇒  Set background color to default, ECMA-48 3rd.

修改字体

Ps描述适用终端及标准
0正常(默认)VT100
1粗体VT100
2灰暗字体ECMA-48 第二版
3斜体ECMA-48 第二版
4下划线VT100
5闪烁VT100(在 X11R6 xterm 显示为粗体)
7反转(高亮)VT100
8不可见,例如,隐藏ECMA-48 第二版,VT300
9删除线ECMA-48 第三版

注意
“适用终端及标准”为空,表示默认支持大部分终端,例如 Xterm 、VT100 ~ VT500 等。

[root@natnet-source ~]$ cat test_font.sh 
#!/bin/bash
test_echo() {
        echo -e "$1"
        echo
}

for i in `seq 1 9`;
do
        test_echo "\e[${i}mPs=$i\e[0m"
done

Shell 酷炫提示符动态效果-测试字体

修改字体颜色

Ps类型颜色适用终端及标准
30前景色
31前景色
32前景色绿
33前景色
34前景色
35前景色
36前景色
37前景色
39前景色默认ECMA-48 第三版
40背景色
41背景色
42背景色绿
43背景色
44背景色
45背景色
46背景色
47背景色
49背景色默认ECMA-48 第三版

注意
“适用终端及标准”为空表示默认支持大部分终端,例如 Xterm 、VT100 ~ VT500 等。

[root@natnet-source ~]$ cat test_color.sh 
#!/bin/bash
test_echo() {
        echo -e "$1"
        echo
}

for i in `seq 30 49`;
do
        if [[ $i != 38 && $i != 48 ]];then 
                test_echo "\e[${i}mPs=$i\e[0m"
        fi
done

在这里插入图片描述

组合使用字体

[root@natnet-source ~]$ cat test_combine_font.sh 
#!/bin/bash
test_echo() {
        echo -e "$1"
        echo
}

for i in `seq 1 9`;
do
        if [[ $i -gt 1 ]];then
                cs=${cs}\;$i
        else    cs=$i
        fi

        test_echo "\e[${cs}mPs=${cs}\e[0m"
done

Shell酷炫提示符动态效果-字体组合

组合使用颜色

这里指的是组合使用前景色和背景色,无法组合使用同一种类型的颜色,最后一个 Ps 指定的颜色生效,覆盖之前的。例如:

echo -e "\e[30;31;32m What will happen ?"

在这里插入图片描述

组合使用前景色和背景色的效果如下:
当前景色为白色时,设置背景色为绿色;除此之外,背景色都为白色。

[root@natnet-source ~]$ cat test_combine_color.sh 
#!/bin/bash
test_echo() {
        echo -e "$1"
        echo
}

for i in `seq 30 39`;
do
        if [[ $i != 37 ]];then
                cs=${i}\;47
        else    cs=${i}\;42
        fi

        test_echo "\e[${cs}mPs=${cs}\e[0m"
done

在这里插入图片描述

组合使用字体和颜色

此脚本使用默认背景色,变换前景色,与变换字体的组合。

[root@natnet-source ~]$ cat test_combine_all.sh 
#!/bin/bash
test_echo() {
        echo -e "$1"
        echo
}

for i in `seq 1 9`;
do
        if [[ $i -gt 1 ]];then
                if [[ $i != 9 ]];then
                        cs=${cs}\;${i}\;$((i+29))
                else    cs=${cs}\;${i}\;37
                fi
        else    cs=$i
        fi

        test_echo "\e[${cs}mPs=$cs\e[0m"
done

Shell 酷炫提示符动态效果-字体颜色组合

不同终端工具显示的效果可能有差异

分别在两个终端工具内执行如下命令:

echo -e "\e[9m删除线"
echo -e "\e[9m删除线\e[0m"

WindTerm

在这里插入图片描述

SecureCRT

在这里插入图片描述

PS1 配置说明

在交互执行时, bash 在准备好读入一条命令时显示主提示符 PS1, 在需要更多的输入来完成一条命令时显示 PS2。 Bash 允许通过插入一些反斜杠转义的特殊字符来定制这些提示字符串,这些字符被如下解释:

特殊字符描述
\a一个 ASCII 响铃字符 (07)
\d日期,格式是 “星期 月份 日” (例如,“Tue May 26”)
\D{format}format 被传递给 strftime(3),结果被插入到提示字符串中; 空的 format 将使用语言环境特定的时间格式。花括号是必需的
\e一个 ASCII 转义字符 (033)
\h主机名,第一个 `.’ 之前的部分
\H主机名
\jshell 当前管理的作业数量
\lshell 的终端设备名的基本部分
\n新行符
\r回车
\sshell 的名称, $0 的基本部分 (最后一个斜杠后面的部分)
\t当前时间,采用 24小时制的 HH:MM:SS 格式
\T当前时间,采用 12小时制的 HH:MM:SS 格式
@当前时间,采用 12小时制上午/下午 (am/pm) 格式
\A当前时间,采用 24小时制上午/下午格式
\u当前用户的用户名 the username of the current user
\vbash 的版本 (例如,2.00)
\Vbash 的发行编号,版本号加补丁级别 (例如,2.00.0)
\w当前工作目录
\W当前工作目录的基本部分
!此命令的历史编号
#此命令的命令编号
$如果有效 UID 是 0,就是 #, 其他情况下是 $
\nnn对应八进制数 nnn 的字符
\一个反斜杠
[一个不可打印字符序列的开始,可以用于在提示符中嵌入终端控制序列
]一个不可打印字符序列的结束

临时生效

如果想要临时修改 Shell 提示符样式,请使用 export PS1= 命令,执行后会即时生效,在关闭本次会话后失效。

永久生效

如果想要永久修改 Shell 提示符样式,则:

  • 要使影响范围为全局所有用户,建议在/etc/profile.d/目录下新建.sh后缀的 Shell 脚本,写入 export PS1= 命令。
    [root@natnet-source ~]$ cat /etc/profile.d/interactive_shell.sh 
    shopt -s cdable_vars cdspell direxpand dirspell autocd
    export PS1="[\e[1;35;42m\u\e[34m@\e[37m\h\e[0m \e[33;47m\W\e[0m]$ "
    
  • 要使影响范围为单一用户,建议在~/.bash_profile中写入 export PS1= 命令。

注意事项

原始 PS1 的配置为 PS1="[\u@\h \W]\\$ " ,这里\\$是提示符中的特殊字符,登录用户为 root 时为 # ;否则为 $\$

因为我们已经定义了更华丽、酷炫的提示符,因而再使用这个特殊字符意义不大,而且在向 Markdown 笔记的代码块中复制命令时显示效果不佳,显示为注释样式。所以我在使用自定义提示符时,将 \\$ 改为 \$ ,即所有用户的提示符除空格外最后一个字符为$

man bash
#在 man 里面查找 “^PROMPTING”
/^PROMPTING

在这里插入图片描述
可使用如下命令安装 man-pages 的中文版

yum install man-pages-zh-CN.noarch

在这里插入图片描述
安装完后可以使用-L 区域选项选择查看哪个版本的 man-pages 。例如,在安装了 man-pages 中文版后,默认打开的是它;如需查看英文版的,则执行:

man -L en bash
man -L zh_CN bash

区域 的取值可以参考/usr/share/man/下面的目录名称。

ll /usr/share/man/

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何让 Shell 提示符更酷炫 的相关文章

随机推荐

  • centos7 安装GNOME 使用vnc连接

    1 xff1a 查看当前系统运行级别 命令 xff1a runlevel root span class hljs decorator 64 wst runlevel span N span class hljs number 3 span
  • 升级AS gradle错误

    错误信息 Direct local aar file dependencies are not supported when building an AAR 最近升级了AS和gradle 在编译时总是提示 gt Direct local a
  • 【项目实战】Spring体系结构与框架图

    一 Spring 体系结构 Spring 有可能成为所有企业应用程序的一站式服务点 xff0c 然而 xff0c Spring 是模块化的 xff0c 允许你挑选和选择适用于你的模块 xff0c 不必要把剩余部分也引入 下面的部分对在 Sp
  • sizeof的使用方法!!!

    sizeof xff08 int xff09 等的大小依赖于操作系统的位数 xff0c 如果是在 16 位 DOS 环境下 xff0c 用 TC 编译 xff0c 则为 2 xff0c 如果在 windows 环境下 xff0c 用 VC
  • sql中like的所有用法

    在sql结构化查询语言中 xff0c like语句有着至关重要的作用 like语句的语法格式是 xff1a select from 表名 where 字段名 like 对应值 xff08 子串 xff09 xff0c 它主要是针对字符型字段
  • FTP文件服务器拉取不存在的文件后出现连接不上的问题

    公司使用ftp作为各个业态文件交互中转站 xff0c 此FTP功能由我负责开发维护 开发使用的语言是java xff0c 初始化连接代码如下 xff1a span class token keyword public span FTPSCl
  • kali镜像下载官网地址

    http www kali org downloads
  • 如何powershell用7z命令批量压缩文件

    eidt by lfq date 20220915 use to 压缩 如何使用powershell执行7z命令 1 把压缩包里的两份文件放到C盘C Windows System32下 2 win 43 r输入cmd执行7z a file
  • Ubuntu20.04 安装 Google Chrome浏览器

    一 在 Ubuntu 上安装 Google Chrome 1 下载 Google Chrome 使用Ctrl 43 Alt 43 T快捷键或者点击终端图标 xff0c 打开你的终端 安装软件时最好是先更新一下 xff01 sudo apt
  • hexo博客5:更新部署&域名配置

    hexo博客5 xff1a 更新部署 amp 域名配置 一 Hexo更新二 部署脚本三 自定义域名四 参考 一 Hexo更新 管理员模式进入cmd hexo clean hexo generate hexo deploy 二 部署脚本 也可
  • Windows远程连接centos7图形化界面,安装xrdp

    Windows远程连接centos7图形化界面 xff0c 安装xrdp 写在最前面准备工作查看ubuntu系统的版本信息和gcc版本尝试进入图形化界面更新yum 下载安装图形化界面查询本地是否有Server with GUI group安
  • 华为机试—围棋吃子(下围棋)判决(高级题160分:深度优先遍历)(图文吐血整理)

    题目 xff1a 围棋中 xff0c 一个棋子在棋盘上 xff0c 与它直接紧邻的空点是这个棋子的 气 xff0c 棋子直接紧邻的点上 xff0c 如果有同色妻子存在 xff0c 则它们便相互组成一个不可分割的整体 xff0c 它们的 气
  • ConstraintLayout 通过setVerticalBias 实现动态设置控制位置

    使用场景 xff1a 设置布局的时候 xff0c 想通过ConstraintLayout实现滑块与文字同步移动 思路 xff1a ConstraintLayout在xml布局中有layout constraintvertical bias设
  • gdebi来安装依赖关系

    gdebi是一个用于安装你自己手动下载的包的GUI程序 GDebi也可以命令行模式运行 xff08 sudo gdebipackage deb xff09 xff0c 其功能和GUI模式下完全一样 安装 xff1a apt get inst
  • &和&&的区别?

    答 xff1a amp 运算符有两种用法 xff1a 1 按位与 xff1b 2 逻辑与 amp amp 运算符是短路与运算 逻辑与跟短路与的差别是非常巨大的 xff0c 虽然二者都要求运算符左右两端的布尔值都是true整个表达式的值才是t
  • Spring的五种依赖注入方式

    平常的java开发中 xff0c 程序员在某个类中需要依赖其它类的方法 xff0c 则通常是new一个依赖类再调用类实例的方法 xff0c 这种开发存在的问题是new的类实例不好统一管理 xff0c spring提出了依赖注入的思想 xff
  • Unity VR游戏开发干货教程:优化VR体验

    简介 对于VR应用来说 xff0c 如果想要让用户获得好的用户体验 xff0c 特别是免除恶心眩晕的困扰 xff0c 在VR开发中进行优化是必不可少的 xff0c 惟其如此才能达到我们期望的游戏运行帧速 和其它平台上的开发不同 xff0c
  • 使用lombok编译时报错:程序包org.slf4j不存在

    原文链接 xff1a http www jylt cc detail id 61 67987702f9160c26a14d3a421f43dce1 在使用lombok插件打印日志时 xff0c 编译时候报错 xff0c 只需做如下修改即可
  • 企业对C/C++程序员的技能要求

    一个人应该具备对事物的思考能力 xff0c 否则容易被忽悠 对大部分未入门或刚入门的菜鸟来说 xff0c 很难搞明白C语言能做什么和C程序员在做什么这两个问题 如果你打算种菜 xff0c 必须先了解行情 xff08 包括销量和价钱 xff0
  • 如何让 Shell 提示符更酷炫

    使用远程终端时 xff0c 默认的命令行提示符格式已经能满足大部分用户需求了 xff0c 但有时我们希望提示符看起来更直观 优雅 酷炫 美观 xff0c 可以从中直接得到我们想要的信息 xff0c 而且清晰分明 本文就详细讲解一下如何让 S