今天我想给大家分享一个比较繁琐的问题,shell 的提示符。为什么要介绍这个呢?有人可能会问了,你之前不是介绍过了吗?
chaojun@ubuntu:~$ // chaojun 是用户名,ubuntu 是主机名,$ 表示是普通用户
root@ubuntu:~# // root 是用户名,ubuntu 是主机名,# 表示是超级用户
不就是上面这些东西吗?你还想介绍些什么?如果你只是这样想的,那就就大错特错了,而且我想你很有必要把这篇文章认真读完,而且我强烈建议你读一下,因为你还不清楚一些 shell 和终端仿真器的内部工作方式,读完本文,你就会有一个清醒的认识了。
1. 详细介绍一个 shell 提示符
例子:chaojun@ubuntu:~/file$
前面的 chaojun@ubuntu
是由 @
分割开的用户名和主机名,接着是一个冒号,冒号后面是一个目录,目录结束后是一个 $
提示符,代表普通用户。
那么我们可不可以改变提示符的格式呢?其实是完全可以的,shell 提示符的格式是由一个全局环境决定的,我们可以在终端中输入:echo $PS1
查看(PS1 是“prompt string one”的简写)。比如我的查看结果如下图:
哦,看不懂,这是些什么呀,\ [ ] ; @ : + _ $ { } 0-9
反正就是字符数字符号组成的一串字符串,它代表什么含义呢?为了搞清楚这个环境变量中的内容是什么意思,我们先来看一个表:
序列 | 显示值 |
---|---|
\a | 以 ASCII 格式编码的铃声 . 当遇到这个转义序列时,计算机会发出嗡嗡的响声。 |
\d | 以日,月,天格式来表示当前日期。例如,“Mon May 26.” |
\h | 本地机的主机名,但不带末尾的域名。 |
\H | 完整的主机名。 |
\j | 运行在当前 shell 会话中的工作数。 |
\l | 当前终端设备名。 |
\n | 一个换行符。 |
\r | 一个回车符。 |
\s | shell 程序名。 |
\t | 以24小时制,hours:minutes:seconds 的格式表示当前时间. |
\T | 以12小时制表示当前时间。 |
@ | 以12小时制,AM/PM 格式来表示当前时间。 |
\A | 以24小时制,hours:minutes 格式表示当前时间。 |
\u | 当前用户名。 |
\v | shell 程序的版本号。 |
\V | shell程序的版本号 |
\w | 当前工作目录名。 |
\W | 当前工作目录名的最后部分。 |
! | 当前命令的历史号。 |
# | 当前 shell 会话中的命令数。 |
$ | 这会显示一个"$"字符,除非你拥有超级用户权限。在那种情况下, 它会显示一个"#"字符。 |
[ | 标志着一系列一个或多个非打印字符的开始。这被用来嵌入非打印 的控制字符,这些字符以某种方式来操作终端仿真器,比方说移动光标或者是更改文本颜色。 |
] | 标志着非打印字符序列结束。 |
2. 尝试修改 PS1 环境变量
知道了上表中的各个字符代表的含义后,我们就可以试着改变一下 PS1 环境变量,然后看看我们的 shell 提示符会有什么样的变化了。
2.1. 备份 PS1
如下图,我们在终端输入:echo $PS1 > PS1.bak
将环境变量备份到文件 PS1.bak
,然后输入命令:cat PS1.bak
确定一下是否备份成功<font color=red>(非常重要)</font>。
2.2. 试试 PS1=
让 PS1 等于空
20190319112733219_202148850.png
如上图,如果我们把 PS1 设置为空的话,就什么提示符都看不到了。
2.3. 试试 PS1="\$ "
和 PS1="\$"
这样我们能看到提示符了,注意第一个和第二个区别是 $ 后面有没有一个空格,我希望你自己动手看看效果,我这里就不贴图了。
2.4. 试试 PS1="\a\$ "
设置完后试试按键盘上不同的键,特别是 delete 和 enter ,注意到有提示音了吗?
2.5. 更丰富的 shell 提示符
-
PS1="\A \h \$ "
:包含主机名和当天的信息。
- 添加颜色
除了上面表中的那些转义字符的效果,我们还可以给 shell 提示符加上颜色、字体和光标位置等的控制,我们先来看看如何添加颜色吧。
字符颜色是由发送到终端仿真器的一个嵌入到了要显示的字符流中的 ANSI 转义编码来控制的。 这个控制编码不会“打印”到屏幕上,而是被终端解释为一个指令。下面我们来看看用转义序列来设置文本颜色时用到的一些转义序列:
序列 | 文本颜色 | 序列 | 文本颜色 |
---|---|---|---|
\033[0;30m | 黑色 | \033[1;30m | 深灰色 |
\033[0;31m | 红色 | \033[1;31m | 浅红色 |
\033[0;32m | 绿色 | \033[1;32m | 浅绿色 |
\033[0;33m | 棕色 | \033[1;33m | 黄色 |
\033[0;34m | 蓝色 | \033[1;34m | 浅蓝色 |
\033[0;35m | 粉红 | \033[1;35m | 浅粉色 |
\033[0;36m | 青色 | \033[1;36m | 浅青色 |
\033[0;37m | 浅灰色 | \033[1;37m | 白色 |
知道了上表,我们来个例子试试吧:PS1='\[\033[0;31m\]<\u@\h \W>\$'
,看看我们是不是把 shell 提示符改成红色了,如下图:
上面的设置会导致我们 shell 提示符后面输入的内容也会变成红色,所以我们再试试这个例子:PS1='\[\033[0;31m\]<\u@\h \W>\$\[\033[0m\]'
,看看 shell 提示符后面输入的内容有没有变成白色呢?如下图:
噢哦,到这里是不是发现越来越好玩了,我们完全可以把 shell 提示符折腾成我们自己喜欢的样子啦。
- 背景色设置
前面讲到设置 shell 提示符的颜色,那可不可以设置背景颜色呢?这也是可以的,还是老规矩,先来看看有那些转义序列,如下表:
序列 | 背景颜色 | 序列 | 背景颜色 |
---|---|---|---|
\033[0;40m | 蓝色 | \033[1;44m | 黑色 |
\033[0;41m | 红色 | \033[1;45m | 紫色 |
\033[0;42m | 绿色 | \033[1;46m | 青色 |
\033[0;43m | 棕色 | \033[1;47m | 浅灰色 |
好了,来看个例子吧,我们设置一个带有红色背景的 shell 提示符:PS1='\[\033[0;41m\]<\u@\h \W>\$\[\033[0m\] '
,如下图:
- 移动光标
上面已经介绍了转义字符、转义颜色、转义背景颜色三种转义序列了,我们再来看看如何使用转义序列控制光标,还是先来看一个表吧:
转义编码 | 行动 |
---|---|
\033[l;cH | 把光标移到第 l 行,第 c 列。 |
\033[nA | 把光标向上移动 n 行。 |
\033[nB | 把光标向下移动 n 行。 |
\033[nC | 把光标向前移动 n 个字符。 |
\033[nD | 把光标向后移动 n 个字符。 |
\033[2J | 清空屏幕,把光标移到左上角(第零行,第零列)。 |
\033[K | 清空从光标位置到当前行末的内容。 |
\033[s | 存储当前光标位置。 |
\033[u | 唤醒之前存储的光标位置。 |
这里给出一个在屏幕的上方画出一个 包含时钟(由黄色文本渲染)的红色长条的例子吧:这段看上去令人敬畏的字符串如下:
PS1='\[\033[s\033[0;0H\033[0;41m\033[K\033[1;33m\t\033[0m\033[u\]<\u@\h \W>\$ '
我们看看 Ubuntu 系统默认的也拿出来一起对比一下吧:
PS1='\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
发现 Ubuntu 系统默认的还要复杂一些,至少它包括了一些 shell 脚本的语法,其实我们的 PS1 环境变量是完全可以加入 shell 函数和 shell 脚本的,这样我们就还有许多事情可以由 shell 提示符来完成,今天的文章只是一个开始,对于喜欢折腾的你来说,shell 提示符的这种可定制可修改是不是让你增加了几分乐趣呢?不过 Ubuntu 系统默认的 shell 提示符已经很漂亮了,我们也没有必要去修改它。如果你想折腾,完全可以安装上面几个表中的转义序列去修改,找到一个自己喜欢的样式。
3. 永久保存 PS1 环境变量的值
如果我们在上面的折腾中,通过不断的优化,设计出了一种自己非常满意的 shell 提示符的样式,我们可以将其永久保存,这样就不必每次都在终端输入:PS1='什么什么的' 来修改了,方法如下:
终端输入:gedit ~/.bashrc &
,在弹出的编辑器中,翻到最末尾,加入如下两行,其中第一行要根据你自己设计的相应改变,我下面写的知识示例,并不好看,所以你要替换掉。
PS1='\[\033[s\033[0;0H\033[0;41m\033[K\033[1;33m\t\033[0m\033[u\]<\u@\h \W>\$ '
export PS1
好了,今天分享的内容有两个目的,一个是让大家知道 shell 和终端模拟器是一种交互的关系,可以通过设置 shell 的环境变量让终端模拟器有不同的表象;另一个目的是让大家明白 shell 提示符是怎么得来的,我们可以定制,并不是一尘不变的,同时给喜欢别具风格的朋友一个修改自己特有的 shell 提示符的方法。
文章参考了 Bash Prompt HOWTO (Bash 提示符基本知识),感兴趣的朋友可以在浏览器打开:http://tldp.org/HOWTO/Bash-Prompt-HOWTO/
查看相关内容哦。
最后给大家看看我在网络上找的一个修改后的效果图,比较花哨。
20190319145108254_1749746712.png
网友评论