shell提示符的个性化设定

shell提示符的个性化设定(一)

                                                                                                                                                                                                                                                               

第一、bash 有两级用户提示符。

第一级:是你经常看到的 bash 在等待命令输入时的提示符。缺省的一级提示符是字符$<美元符号>(如果是超级用户,则是#<井或散列>号)。
你可以通过改变bash PS1变量的值来改变你的缺省提示符,

例如: 
PS1="Please enter a command" 
bash shell 的提示符该为指定的字符串。如果退出刚刚设定的变量读取系统默认的变量的话,暂时没有什么好办法,crtl+d 退出再次登陆读取系统默认变量。

 

第二级:当bash 期待输入更多的信息以完成命令时显示第二级提示符。缺省的第二级提示符是 > 如果你要改变第二级提示符,可以通过设置PS2变量的值来实现: 
PS2="I need more information" 

 

第二、特殊字符定义你的变量提示符
另外你还可以用特殊的字符来定义你的提示符,下面的列表列出了最常 用的特殊字符。 
提示符特殊字符代码字符含义:
\! 
显示该命令的历史记录编号。 
\# 
显示当前命令的命令编号。 
\$ 
显示$符作为提示符,如果用户是root的话,则显示#号。 
\\ 
显示反斜杠。 
\d 
显示当前日期。 
\h 
显示主机名。 
\n 
打印新行。 
\nnn 
显示nnn的八进制值。 
\s 
显示当前运行的shell的名字。 
\t 
显示当前时间。 
\u 
显示当前用户的用户名。 
\W 
显示当前工作目录的名字。 
\w 
显示当前工作目录的路径。 

第三、特殊符号的组合
这些特殊字符能组合成很多种有用的提示符方案(也可以组合为很奇异
的方案),例如把 PS1 设为: 
PS1="\t" 
这导致提示符显示当前的时间,就象下面的显示一样(提示符后面将不
会有空格): 
02:16:15 
而下面的设置: 
PS1=\t 
将导致提示符变成下面的样子: 

这显示了设置中引号的重要性,下面的提示符串: 
PS1="\t\\ _ " 
会使提示符看起来象这个样子: 
02:16:30\ _
这种情况下,提示符后面会有一个空格(灰色处),因为引号里有一个空格。 该例就是使用两个特殊字符的组合得到的。

第四、控制shell的运行方式
Bash
有一些特殊变量,能控制shell以不同的方式工作。

 

例如:

变量noclobber能防止在重定向输出时意外地覆盖一个文件。

通过set命令可以设置noclobber变量的有效或无效。set命令有两个参数:一个是指定变量开(on)或关(off)的选项,一个是特殊变量的变量名。要使某一特殊变量开(有效),用-o选项,要使其关(无效),用+o选项。

例如:
$ set –o noclobber    //
使noclobber变量开
$ set +o noclobber    //
使noclobber变量关

三个最常用的shell特殊变量有:ignoreeofnoclobbernoglob

  ignoreeof

  ignoreeof变量用来禁止使用ctrl+d来退出shellctrl+d不仅用来退出shell,而且可以终止用户直接输往标准输出上的输入。该操作经常在一些shell实用命令中使用,例如实用命令cat。在这些实用程序操作中,非常容易误操作而意外地退出shellignoreeof特殊变量正是用来防止这种意外的退出。例如:
$ set –o ignoreeof
设置之后,用户只能用logoutexit命令退出shell

  noclobber

  noclobber变量可以在重定向输出时保护已存在的文件,防止被意外地覆盖。在下例中,用户设置noclobber为有效,在重定向时,用户试图去覆盖已经存在的文件myfile,此时系统将返回一个错误信息。
  
[例]
   $ set –o noclobber
   $ cat preface>myfile
   bash: myfile: cannot overwrite existing file
   $


  noglob

  设置noglob变量后,shell将不扩展文件名中一些特殊的字符或字符串。如字符*?、[]等将不再作为通配符。如果用户希望列出结尾为?的文件名answer?,可通过如下步骤:首先,用户使noglob变量为无效,然后再列出文件名。可以看到,目前命令行上的问号?被认为是文件名中的一个字符,而不再被看作通配符。
$ set –o noglob
$ ls answer?
answer?


第五、子shellexport命令

  用户登录到Linux系统后,系统将启动一个用户shell。在这个shell中,可以使用shell命令或声明变量,也可以创建并运行shell脚本程序。运行shell脚本程序时,系统将创建一个子shell。此时,系统中将有两个shell,一个是登录时系统启动的shell,另一个是系统为运行脚本程序创建的shell。当一个脚本程序运行完毕,它的脚本shell将终止,可以返回到执行该脚本之前的shell。从这种意义上来说,用户可以有许多 shell,每个shell都是由某个shell(称为父shell)派生的。

  在子shell中定义的变量只在该子shell内有效。如果在一个shell脚本程序中定义了一个变量,当该脚本程序运行时,这个定义的变量只是该脚本程序内的一个局部变量,其他的shell不能引用它,要使某个变量的值可以在其他shell中被改变,可以使用export命令对已定义的变量进行输出。 export命令将使系统在创建每一个新的shell时定义这个变量的一个拷贝。这个过程称之为变量输出。

  [例]在本例中,变量myfile是在dispfile脚本程序中定义的。然后用export命令将变量myfile输出至任何子shell,例如当执行printfile脚本程序时产生的子shell

  dispfile脚本程序清单
   /**************begin dispfile**************/
   myfile=”List”
   export myfile
   echo “Displaying $myfile”
   pr –t –n $myfile
   printfile
  /**************end dispfile***************/

   printfile脚本程序清单:
    /**************begin printfile**************/
    echo “Printing $myfile”
    lpr $myfile&
   /**************end printfile**************/

  $dispfile
    Displaying List
   1 screen
   2 modem
   3 paper

  Printing List

  $

  定制Bash

  在本节中已经介绍了很多定制Bash的方法,但是迄今为止,这些方法都只是对当前Bash对话有用。只要用户退出登录,所做的一切改变都会丢失。所以应该在Bash的初始化文件中做永久性的修改。

  用户可以将每次启动Bash所需要执行的命令放入初始化文件中,最常见的命令就是alias命令和变量定义两种。系统中的每个用户在其主目录中都有一个.bash_profile文件,Bash每次启动时都将读取该文件,其中包含的所有命令都将被执行。

  下面便是默认.bash_profile文件的代码:

  #.bash_profile
    #Get the aliases and functions
    if
-f ~/.bashrc ;then
    .~/.bashrc
    fi
    #User specific environment and startup programs
  
 PATH=$PATH:$HOME/bin
    ENV=$HOME/.bashrc
    USERNAME=””
    Export USERNAME ENV PATH


  思考题

  1. Linux中的shell有哪些类型?Linux操作系统的缺省shell是什么?

  2. shell有哪些通配符?各起什么作用?

  3. shell中有哪三种引号?它们的作用有什么不同?

  4. 要统计/usr/bin目录下的文件个数,用重定向和管道分别完成,怎样做?

  5. 命令替换与重定向有何区别?举例说明。
本文来自:http://www.linuxpk.com/2302.html

 

 

shell提示符的个性化设定(二):终端显示颜色的设置

方法一:

我想改变 init 3登录的默认终端颜色,请问用什么命令

.bash_profile 里添加


setterm -foreground green -background black -store

source ./bash_profile

可以看一下settermmanpage

 

方法二:

 

[精华] 改变linux终端颜色[]

提示行基础            

彩色化               

Xterm 中的乐趣       

            

            

 

如果您很容易使 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                40               
黑色
   31                41               
紅色
   32                42               
綠色
   33                43               
黃色
   34                44               
藍色
   35                45               
紫紅色
   36                46               
青藍色
   37                47               
白色

 

 

 代码              意义
   -------------------------
   0                 OFF
   1                 
高亮显示
   4                 underline
   5                 
闪烁
   7                 
反白显示
   8                 
不可见

 

要使用这个表,首先请查找您要使用的颜色,然后查找对应的前景编号 (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 

 

这样,无论您开启一个登录 shell 还是一个非登录 shell,都会获得同样的提示行。 

好了,您已掌握了提示行魔术。现在尽情享受一下,制作一个漂亮的彩色提示行吧!

posted @ 2011-10-08 22:56  sangreal  阅读(1868)  评论(0编辑  收藏  举报