Linux中shell提示符定制

  如果您很容易使 shell 提示行变得色彩绚烂斓且带有更多信息,为什么还要坚持用单调的标准 shell 提示行呢?在这篇技巧中,Daniel Robbins 将说明如何获得符合您的意愿的 shell 提示行,并会说明如何动态更新 X 终端的标题栏。

  作为 Linux/UNIX 人,我们有很长的时间是在 shell 中工作,并且在许多情况下,下面这一行就是始终盯着我们的那个提示行:

bash-2.04$

  如果您恰巧是超级用户 (root),您就有权使用下面这个美丽的标示“身份”的提示行版本:

bash-2.04#

  这些提示行并不是十分漂亮。这也就难怪几种 Linux 版本对默认提示行进行了升级,在其中增加了颜色和更多的信息。但是,即便您恰好有一个本身带有很好的彩色提示行的新式版本,它也不可能是完美无缺的。您或许希望在提示行中增加或更改几种颜色,或者增加(或删除)一些信息。从头开始设计属于您自己的彩色的、经过装饰的提示行并不难。

提示行基础

  在 bash 下,可以通过更改 PS1 环境变量的值来设置提示行,如下所示:

$ export PS1="> "
>

  更改会立即生效,通过将 “export” 定义放在您的 ~/.bashrc 文件中可将这种更改固定下来。只要您愿意,PS1 可以包含任意数量的纯文本:

$ export PS1="This is my super prompt > "
This is my super prompt >

  尽管这很有趣,但在提示行中包含大量静态文本并不是特别有用。大多数定制的提示行包含诸如用户名、工作目录或主机名之类的信息。这些花絮信息可以帮助您在 shell 世界中遨游。例如,下面的提示行将显示您的用户名和主机名:

$ export PS1="\u@\H > "
drobbins@freebox >

  这个提示行对于那些以多个不同名称的帐户登录多台机器的人尤为有用,因为它可以提醒您:您目前在哪台机器上操作,拥有什么权限。
  在上面的示例中,我们使用了专用的用反斜杠转义的字符序列,藉此通知 bash 将用户名和主机名插入提示行中,当这些转义字符序列出现在 PS1 变量中时,bash 就会用特定的值替换它们。我们使用了序列 “\u”(表示用户名)和 “\H”(表示主机名的第一部分)。下面是 bash 可识别的全部专用序列的完整列表(您可以在 bash man page 的 “PROMPTING” 部分找到这个列表):

序列 说明
\a ASCII 响铃字符(也可以键入 \007)
\d “Wed Sep 06” 格式的日期
\e ASCII 转义字符(也可以键入 \033)
\h 主机名的第一部分(如 “mybox”)
\H 主机的全称(如 “mybox.mydomain.com”)
\j 在此 shell 中通过按 ^Z 挂起的进程数
\l 此 shell 的终端设备名(如 “ttyp4”)
\n 换行符
\r 回车符
\s shell 的名称(如 “bash”)
\t 24 小时制时间(如 “23:01:01”)
\T 12 小时制时间(如 “11:01:01”)
\@ 带有 am/pm 的 12 小时制时间
\u 用户名
\v bash 的版本(如 2.04)
\V Bash 版本(包括补丁级别) ?/td>
\w 当前工作目录(如 “/home/drobbins”)
\W 当前工作目录的“基名 (basename)”(如 “drobbins”)
\! 当前命令在历史缓冲区中的位置
\# 命令编号(只要您键入内容,它就会在每次提示时累加)
$ 如果您不是超级用户 (root),则插入一个 “$”;如果您是超级用户,则显示一个 “#”
\xxx 插入一个用三位数 xxx(用零代替未使用的数字,如 “\007”)表示的 ASCII 字符
\\ 反斜杠
\[ 这个序列应该出现在不移动光标的字符序列(如颜色转义序列)之前。它使 bash 能够正确计算自动换行。
\] 这个序列应该出现在非打印字符序列之后。

  这样,您已经知道了 bash 中用反斜杠转义的全部专用序列。请稍微演练一下这些序列,以对它们的工作方式获得一些感性认识。在您做了一些测试之后,下面开始添加颜色。

彩色化

  添加颜色相当容易;第一步是设计不带颜色的提示行。然后,我们所要做的只是添加终端(而不是 bash)可识别的专用转义序列,以使它以彩色显示文本的某些部分。标准 Linux 终端和 X 终端允许您设置前景(文字)颜色和背景颜色,如果需要,还可以启用 “bold” 字符。有八种颜色可供我们选择。
  颜色是通过在 PS1 中添加专用序列来选择的 – 基本上是夹在 “\e[“(转义开方括号)和 “m” 之间数字值。如果指定一个以上的数字代码,则用分号将它们分开。下面是一个颜色代码示例:

"\e[0m"

  如果将数字代码指定为零,则它就会通知终端将前景、背景和加粗设置重置为它们的默认值。您可能会在在提示行结束时使用这个代码,以使您键入的文字成为非彩色的。现在,让我们看一下这些颜色代码。请注意下面的抓屏结果:

颜色表

  要使用这个表,首先请查找您要使用的颜色,然后查找对应的前景编号 (30-37) 和背景编号 (40-47)。例如,如果您喜欢黑底绿字,则可将编号分别设为 32 和 40。然后打开您的提示行定义并在其中添加适当的颜色代码。下面的定义:

export PS1="\w> "

变为:

export PS1="\e[32;40m\w> "

  到现在为止,提示行尽管已经很不错了,但仍不太完美。在 bash 显示出工作目录以后,我们需要使用 “\e[0m” 序列将颜色重新设置为正常值。

export PS1="\e[32;40m\w> \e[0m"

  这个定义将显示一个漂亮的绿色提示行,但我们仍需要做一些扫尾工作。我们不需要包括 “40” 这个背景颜色设置,因为它将背景设置为黑色,而黑色是默认颜色。此外,绿色还很暗;我们通过添加一个 “1” 颜色代码来修正这个问题,这将启用更亮的加粗文字。除了这个修改之外,我们还需要将全部非打印字符用专用的 bash 转义序列 “[” 和 “]” 括起来。这两个序列通知 bash,被括起来的字符不占用行上的任何空间,这样就使自动换行能够继续正常工作。没有这两个转义序列,尽管您有了一个非常漂亮的提示行,但是如果您键入的命令恰好到达终端的最右端,就会造成显示混乱。下面是我们最终的提示行:

export PS1="\[\e[32;1m\]\w> \[\e[0m\]"

  别担心在同一个提示行中使用几种颜色,就像下面这样:

export PS1="\[\e[36;1m\]\u@\[\e[32;1m\]\H> \[\e[0m\]"

Xterm 中的乐趣

  我已说明了如何在提示行中添加信息和颜色,但您还可以更进一步。您可以通过在提示行中添加专用代码来使 X 终端(如 rxvt 或 aterm)的标题栏得到动态更新。您所要做的只是将下面的序列添加到您的 PS1 提示行中:

"\e]2;titlebar\a"

  只须用您希望其出现在 xterm 标题栏中的文字替换子串 “titlebar” 即可,现在已经一切就绪了!不必使用静态文字;您可以将 bash 转义序列插入标题栏中。请查看下面这个示例,它将用户名、主机名和当前工作目录显示在标题栏中,并定义了一个简短、明亮的绿色提示行:

export PS1="\[\e]2;\u@\H \w\a\e[32;1m\]>\[\e[0m\] "

  这就是我在上面的抓屏结果中所用的那个提示行。我喜欢这个提示行,因为它将全部信息显示在标题栏上,而不是显示在终端上,终端对一行可以显示多少字符有限制。顺便提一句,确保用 “[” 和 “]” 将您的标题栏序列括起来(因为就终端而言,这个序列是非打印序列)。将大量信息放在标题栏中的问题是,如果您使用非图形终端(如系统控制台),则看不到这些信息。为了解决这个问题,可以在您的 .bashrc 中添加以下几行:

if [ "$TERM" = "linux" ]
then
#we're on the system console or maybe telnetting in
export PS1="\[\e[32;1m\]\u@\H > \[\e[0m\]"
else
#we're not on the console, assume an xterm
export PS1="\[\e]2;\u@\H \w\a\e[32;1m\]>\[\e[0m\] "
fi

  这个 bash 条件语句将根据当前的终端设置动态设置提示行。为了获得一致性,您一定希望配置您的 ~/.bash_profile,以便它在启动时搜索 (source) 您的 ~/.bashrc。确保您的 ~/.bash_profile 文件中有以下这样一行:

source ~/.bashrc

原文地址:http://www.cnblogs.com/ask2650/articles/1669637.html

Linux中shell提示符定制相关推荐

  1. linux+管道+分段,Linux中shell基础、重定向、管道符、环境变量

    原标题:Linux中shell基础.重定向.管道符.环境变量 1.什么是shell Shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口(命令解释器).它接收用户输入的命令并把它送入内核 ...

  2. linux中shell变量$#,$@,$0,$1,$2的含义解释

    linux中shell变量$#,$@,$0,$1,$2的含义解释:  变量说明:  $$  Shell本身的PID(ProcessID)  $!  Shell最后运行的后台Process的PID  $ ...

  3. linux中shell如何实现毫秒级别的sleep

    方法2.usleep 10000 (usleep为十的负六次方秒,详细见man usleep) 本文转自博客园知识天地的博客,原文链接:linux中shell如何实现毫秒级别的sleep,如需转载请自 ...

  4. Linux中shell的分类以及查看当前的shell

    DOS/Windows 与 Linux 的最重要的区别之一是 Linux 的命令 shell 是与操作系统相分离的一层. 目前流行的shell有ash.bash.ksh.csh.zsh,如下介绍: b ...

  5. linux中sh+$0,浅谈linux中shell变量$#,$@,$0,$1,$2的含义解释

    摘抄自:ABS_GUIDE 下载地址:http://www.tldp.org/LDP/abs/abs-guide.pdf linux中shell变量$#,$@,$0,$1,$2的含义解释: 变量说明: ...

  6. linux变量中代,linux中shell变量$#,$@,$0,$1,$2和变量${0%/*}

    一直傻傻搞不清,还是梳理一下吧. linux中shell变量$#,$@,$0,$1,$2的含义解释: 变量说明: $$ Shell本身的PID(ProcessID) $! Shell最后运行的后台Pr ...

  7. linux下变量名长度,Linux中shell的变量介绍

    Linux中shell的变量介绍 发布时间:2020-06-24 16:20:39 来源:亿速云 阅读:112 作者:元一 这期内容当中的小编将会给大家带来有关Linux中shell的变量介绍,以专业 ...

  8. 浅谈linux中shell变量$#,$@,$0,$1,$2,$?的含义解释

    浅谈linux中shell变量$#,$@,$0,$1,$2,$?的含义解释 下面小编就为大家带来一篇浅谈linux中shell变量$#,$@,$0,$1,$2的含义解释.小编觉得挺不错的,现在就分享给 ...

  9. Linux中 shell 脚本获取当前工作目录的方法

    Linux中 shell 脚本获取当前工作目录的方法 1. 示例 2. 注意: 参考: 1. 示例 test.sh target_dir=$(cd $(dirname $0); pwd) echo $ ...

最新文章

  1. Android巩固之事件分发机制
  2. c# BackgroundWorker组件介绍(属性、方法、事件)
  3. Fiddler代理手机抓包
  4. HTML和CSS在IE7中常见的兼容性问题
  5. Ubuntu安装okular PDF阅读器
  6. 疫情下跨境电商逆势增长,大数据告诉你如何抓住跨境网购新趋势
  7. ​清华大学提出基于生成对抗神经网络的自然图像多风格卡通化方法并开源代码...
  8. OpenGL® ES 3.0 Programming Guide - Book Website
  9. Python MySQL创建表
  10. java方法、方法重载
  11. 数据可视化(5)--jqplot经典实例
  12. Python自动化必会技能-Excel文件读取
  13. 安装IIS服务 找不到staxmem.dll文件的解决方法
  14. 汇编语言指令系统——控制转移类指令
  15. 进制的转换(计算方法)
  16. 恒生电子2018秋招笔经面经(开发岗)
  17. c语言gcd 简易函数,简单[GCD]用法详细总结(上)
  18. iOS 音乐播放器之锁屏歌词+歌词解析+锁屏效果
  19. 关于李沐深度学习softmax学习中代码出错的问题及解决方法
  20. 对待员工的4个阶段:我如何让员工过好自己的一生?

热门文章

  1. spring boot(三)Junit 测试controller
  2. 压缩的问题-----WriteUp
  3. 窗口发送消息参数详解
  4. 锋神教我数据库,吴大哥教我写文档——其一
  5. HDU 1422 重温世界杯 环形序列的最长非负连续子序列
  6. Err.number错误号和错误说明(一)
  7. 一线数分师天天被喷不值钱,数据分析师如何“刷存在感”?
  8. 锂电池接线方法图_锂电池制浆工艺(2)——制浆设备种类及特征
  9. python中函数用法教程_Python中zip()函数用法实例教程
  10. delphi 从字符串末尾向前查找_零基础学python之字符串