如何让 Shell 提示符更酷炫

news2024/11/25 15:56:17

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/154181.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

13_9、Java的IO流之NIO.2中Path、Paths、Files类的使用

一、引入1、Java NIO (New IO,Non-Blocking IO)是从Java 1.4版本开始引入的一套新的IO API,可以替代标准的Java IO API。NIO与原来的IO有同样的作用和目的,但是使用的方式完全不同,NIO支持面向缓冲区的(IO是面向流的)、基于通道的…

cinder对接nfs后端存储

1.部署配置流程 1.安装nfs服务端 可以新增一个节点,或直接使用计算节点,因为存储节点上已经有lvm了这里直接使用计算节点来安装 yum install nfs-utils -y2.修改配置 vi /etc/exports # 要共享的目录 允许的网络1(操做权限) 允许的网络2(操做权限) …

Mybatis源码分析(八)MapperMethod的Select分析

目录一 Select1.1 参数的对应解析convertArgsToSqlCommandParam1.2 ID获取对应的MappedStatement1.3 MappedStatement交给执行器执行1.4 根据参数获取BoundSql1.5 SqlNode节点的解析1.5.1 MixedSqlNode1.5.2 IfSqlNode1.5.3 StaticTextSqlNode1.5.4 TextSqlNode1.6 执行器执行查…

Delete `␍`eslint(prettier/prettier) 错误的解决方案

Delete ‘␍’ eslint(prettier/prettier) 错误的解决方案 问题背景 在Windows笔记本上新拉完代码,在执行pre-commit时,出现如下错误: Delete ␍eslint(prettier/prettier)下面是几种个人尝试过的解决方案: 解决方案 一、Crtl…

【自学Python】Python bytes转string

Python bytes转string Python string转bytes教程 在 Python 中,bytes 类型和 字符串 的所有操作、使用和内置方法也都基本一致。因此,我们也可以实现将 bytes 类型转换成 string 类型。 Python bytes转string方法 Python bytes 转 string 方法主要有…

effective c++读书笔记4

设计class犹如设计type新type的对象应该如何被创建和销毁?:这会影响到你的class的构造函数和析构函数以及内存分配函数和释放函数的设计。对象的初始化和对象的赋值有什么样的区别?这答案决定你的构造函数和赋值操作符的行为,以及…

分享一套Springboot个人博客系统源码带本地搭建教程

Springboot个人博客系统源码带本地搭建教程,需要源码学习可私信我获取。 技术架构 前端框架:JQuery SemanticUI Markdown prism animatecss Tocbot zplayer lightbox 后端框架:SpringBoot 2.2.5 Mybatis Thymeleaf PageHelper m…

基于JAVA SSM springboot实现的抗疫物质信息管理系统设计和实现

基于JAVA SSM springboot实现的抗疫物质信息管理系统设计和实现 博主介绍:5年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 …

记录一次Spring事务线上异常

Spring事务管理配置方式: XML模糊匹配,绑定事务管理注解,可对每个需要进行事务处理的方法单独配置,只需 Transactional,然后添加属性配置 为简便,本文使用注解方式。Spring初始化时,会通过扫描…

C进阶:通讯录(动态版本 + 文件操作)附源码

本文主要讲解通讯录的代码; 需要拥有结构体,动态内存开辟,文件操作的知识; 目录 🐲一.通讯录思路 🕊️二.三个文件的建立 😼三.所需要使用的变量的创建(包含在头文件contact.h中&…

从0到1完成一个Vue后台管理项目(十三、信息列表页面实现:对话框新增、DateTimePicker 日期时间选择器)

往期 从0到1完成一个Vue后台管理项目(一、创建项目) 从0到1完成一个Vue后台管理项目(二、使用element-ui) 从0到1完成一个Vue后台管理项目(三、使用SCSS/LESS,安装图标库) 从0到1完成一个Vu…

JavaScript 事件流

文章目录JavaScript 事件流概述事件冒泡简介onclick() 事件冒泡addEventListener() 事件冒泡stopPropagation() 阻止事件冒泡事件捕获简介addEventListener() 事件捕获W3C标准事件流取消事件默认行为取消使用对象属性绑定的事件的默认行为取消使用addEventListener()绑定的事件…

社科院与杜兰大学金融管理硕士项目你有了解吗?每年招生一期错过申请太可惜了

社科院与杜兰大学金融管理硕士是个什么项目?社科院是所学校吗,怎么都没听说过。杜兰大学又是哪里的学校?前几天有位咨询的同学抛出这些疑问,着实让我不知如何给予回答。像社科院这么低调的院校太少了。社科院全称是中国社会科学院…

错题 5jxn 8253,neg指令,知CPU频率求经典总线周期,如何取一个字,字扩展指令CBW扩展要求,知道相对位移量求转移后指令偏移地址

1:8253工作于方式1时,输出负脉冲的宽度等于() A:计数初值N-1个CLK脉冲宽度 B:计数初值N1个CLK脉冲宽度C:计数初值N个CLK脉冲宽度 D:计数初值(2N-1)/2个CLK脉冲宽度 方式0和方式1 波形相同(计数过程中低,计数完高)&…

Pytorch 暂退法(Dropout)

在2014年,斯里瓦斯塔瓦等人 (Srivastava et al., 2014) 就如何将毕晓普的想法应用于网络的内部层提出了一个想法: 在训练过程中,他们建议在计算后续层之前向网络的每一层注入噪声。 因为当训练一个有多层的深层网络时,注入噪声只会…

八、Gtk4-GtkBuilder and UI file

1 New, Open and Save button 在上一节中,我们制作了一个非常简单的编辑器。它在程序开始时读取文件,在程序结束时将文件写出来。它可以工作,但不是很好。如果我们有“新建”、“打开”、“保存”和“关闭”按钮就更好了。本节介绍如何在窗口…

【年度总结】2022不忘初心,砥砺前行 2023纵有疾风起,人生不言弃。

2022 工作 砥砺前行 跨境电商跑路 2022年3月,从一家小跨境电商被动跑路,果断处于迷茫期,被动跑路的最好优势就是有赔偿,哈哈,怎么还有一丢丢高兴呢。简单总结了下在该公司的经历,是之前的老大带我去的&am…

如何通过产品帮助中心减轻客服压力,提高内部人员工作效率

客户的问题一直在重复,客服人员压力山大 客户不愿接听客服电话,产品问题难以解决 下班时间休息日,产品问题找谁问? 这些关于客户服务的老问题们困扰着许多产品方多年 要解决以上问题,更好地满足顾客需求。 搭建帮…

基于javaweb(springboot+mybatis)生活美食分享平台管理系统设计和实现以及文档报告

基于javaweb(springbootmybatis)生活美食分享平台管理系统设计和实现以及文档报告 博主介绍:5年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎…

详解函数指针(●‘◡‘●)☞

本文紧接于http://t.csdn.cn/78wbF 这篇一.函数指针数组\ ( >O< ) /1.书写形式&#xff1a;由函数指针内部*变量名>*变量名[n]&#xff1b; 2.使用&#xff1a;函数指针数组的用途&#xff1a;转移表 例如&#xff1a;模拟计算器&#xff1a;#include<stdio.h> …