zoukankan      html  css  js  c++  java
  • bash命令提示符的更改

     用过linux下terminal的人对这样的命令提示符都不会感到陌生

      user@hostname-laptop~$

      这样的提示符本没什么问题,特别是多用户状态下,还能清楚地知道自己的用户名的主机。

      但是,它有一个毛病,那就是把目录同时显示了出来,有时候目录过长的时候,占用了整行,让人很郁闷,比如

      user@hostname-laptop/usr/local/share/man$

      当然,在多用户远程终端下,用户名,主机,用当前目录都是很重要的,怎样合适取决于你个人的需要。

      现在我的需要是在单用户的gnome-terminal下对命令提示符进行改造。用户名和主机根本就不需要提示,或者干脆将其连同当前目录显示在gnome-terminal的标题栏上。另外,还可以加一些其它的特性和颜色。

      现以ubuntu10.04系统为例!

      首先,对命令提示符(prompting)进行改造之前,要清楚是什么东西在对它进行控制。看一下帮助(man bash), 搜一下prompt,一下子就看到了这样几个变量,PS1, PS2, PS3, PS4。再看一下当前系统变量中有没有这几个变量,echo $PS1, echo $PS2, echo $PS4这三个在我的系统里是有的。

      echo $PS1的结果是

      \[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$

      echo $PS2的结果是

      >

      echo $PS4的结果是

      +

      容易看出来,PS1就是用来控制当前命令提示符的,而PS2则用来控制命令没有输完就换行的情况下的提示符。这里我们只关心PS1,这个字符串由许多转义字符组成,这些转义字符表示什么意思,可以查看info bash。

      有几个转义字符是比较明显的,\u表示user, \h表示hostname, \w表示当前目录(将用户主目录缩写成~)。

      再看一下${debian_chroot:+($debian_chroot)},查了一下,这是一个条件赋值。如果系统中有 debian_chroot变量,那么就会加上($debian_chroot),比如我在~/.bashrc中加上export debian_chroot="AAA",那么,我的命令提示符会变成

      (AAA)user@hostname-laptop~$

      debian_chroot和/etc/debian_chroot文件有关,而我的系统下既没有这个文件,debian_chroot变量又没有定义,因此,这一项我可以无视。

      info bash中告诉我们,\[和\]是一对限定符,用来限定一些非打印字符。其潜在意思没有说出来,既然是非打印字符,为什么要限定呢?反正又不会显示。其实不限定一下是会出问题的,因为这些非打印字符会造成命令提示符的混乱。比如从vim退出来时,或者用方向键查看命令历史记录时,会出现一些不友好的状况。因此,这一对限定符的作用在于,终端在决定命令提示符宽度的时候,完全忽略这些非打印字符,同时,它又不会影响这些非打印字符的功能。

      另外,它还有一层意思,那就是,非打印字符必须要放在这一对限定符中间。

      知道了这一点之后,就剩下\e]0;\u@\h: \w\a 这一串符号了。

      \e]0;titlebar\a会标题栏上显示titlebar,即\e]0;和\a及之间的字符构成一个非打印序列,它的作用是将这些字符显示在gnome-terminal的标题栏上。

      \e的ASCII码是033,它还有一个重要作用是颜色的设定。如果用终端上过BBS的人应该知道这个东西,终端上的颜色都是通过它来控制的。

      具体来说,控制当前颜色的命令置于\e[和m之间,中间有一些用分号隔开的数字。比如

      \e[32;1m表示亮绿色。

      其中32表示颜色,1表示颜色的深浅。另外,\e[0m表示恢复原状,后面的文字将不受前面颜色的影响。

      因此,修改后的设置应该是

      export PS1="\[\e]0;\u@\h: \w\a\e[32;1m\]\$\[\e[0m\] "

      注意,前后各有两个非打印字符序列。

      另外,有时候,知道前一个程序运行的结果代码也很有用,其代码是$?,因此,上面的设置又可以改成

      export PS1="\[\e]0;\u@\h: \w\a\e[32;1m\]$?\$\[\e[0m\] "

      附录, ascii颜色控制代码(ANSI/3.64)

     

     前景色
     
      背景色 控制
     
     30
     
     40
     
     黑 0关闭所有属性
     
     31
     
     41 红 1高亮
     
     32绿
     
     42 绿 4单划线
     
     33
     
     43 黄 5闪烁
     
     34
     
     44 蓝 7反显
     
     35粉红
     
     45 粉红 8消隐
     
     36
     
     46 兰 
     
     37
     
     47 白
     
     
     

      因此,每个颜色控制可以由三个数字来控制,比如\e[31;45;5m表示闪烁红字粉底。当然,对闪烁的支持需要有特定的终端。对于gnome-terminal来说,命令

      printf "\e[31;45;5mABC"

      就不会有闪烁的效果,但颜色是有的。

      上面只是给出了ASCII码控制命令中的颜色控制,在实际应用中,比如BBS的终端显示,还涉及到许多其它的控制命令,比如清除屏幕,设置光标等等。具体可以参考一些BBS站的相关版面,比如bdwm的asciiart版, 水木的asciiart版。

  • 相关阅读:
    一起学习Avalonia(三)
    一起学习Avalonia(一)
    .NetCore(Avalonia) 项目dll混淆,deb安装包解压,重新打包
    .Net 桌面程序(winform,wpf,跨平台avalonia)打安装包部署到windows 入门
    .net 跨平台桌面程序 avalonia:从项目创建到打包部署linux-64系统deepin 或 ubuntu。
    【JAVA习题十八】求1+2!+3!+...+20!的和
    【JAVA习题十七】有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。
    【JAVA习题十六】打印菱形
    【JAVA习题十五】两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。
    【JAVA习题十四】猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个 第二天早上又将剩 下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下 的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
  • 原文地址:https://www.cnblogs.com/hanyulcf/p/1891377.html
Copyright © 2011-2022 走看看