PS1~4,终端提示符设置

终端可以说是在Linux的使用中最常用到的工具了,通过设置PS1,PS2,PS3,PS4这四个环境变量,我们就可以个性化定制终端的提示符。

一、PS1—默认的交互提示符

默认情况下PS1为”\s-\v\$”,显示为

-bash-3.2$

通过改变PS1,就可以在提示符显示一些对我们有用的信息,如用户名、工作目录、系统时间等

-bash-3.2$export PS1="\u@\h \w \$"
sunshine@0101 ~ $

其中\u为当前用户名,\h为主机名,\w为当前工作目录的绝对路径(当在个人的主目录下时显示的是~)
以下是其他转义字符代表的信息

\h--主机名
\u--用户名
\w--当前工作目录的绝对路径 如:/usr/bin
\W--当前工作目录的基址名 如上例中的bin
\t--当前的系统时间:HH:MM:SS(24小时制)
\@--当前的系统时间,12小时制, 如:07:14 PM
\d--如“Wed May 28”格式的日期
\n--换行符
\$?--上以命令执行后的返回值,成功执行返回0,否则返回一个非零的数
\!--该条命令在历史命令中的编号
\#--该条命令在这个shell中的编号

下面举例说明:(下面用代表回车键)

-bash-3.2$  export  PS1= "\u@\h \w \t \n\$ "  <CR >
sunshine @0101 ~  19: 40: 50
export  PS1= "\u@\h \w \@ \$ "  <CR > (由于上面设置的PS1变量中含有\n,所以$提示符显示到了第二行 )
sunshine @0101 ~ 07: 40 PM $

下面是我自己使用的终端提示符:

你们会发现,我的提示符是有颜色的,而按照上面设置的颜色是白色的(系统默认的颜色),那么颜色是怎么设置的呢?

下面的设置可以将提示符显示为蓝色:

sunshine @0101 ~ 07: 40 PM $  export  PS1= "\e[0;34m\u@0101 \@ \$ \e[m"

其中

\e[ - 表示颜色指定的开始(当然,\e亦可以用\033替代)
x;ym - 表示颜色的代码
\e[m - 表示颜色指定的结束

颜色代码表:
• 黑色 0;30
• 红色 0;31
• 绿色 0;32
• 棕色 0;33
• 蓝色 0;34
• 紫色 0;35
• 蓝绿色 0;36
• 白色 0;37
!如果把0改变成1,那么相应的颜色会变成深色
如1;31是深红色

当然,我们还可以改变提示符的背景色(下面的设定将提示符的背景改为蓝绿色):

sunshine @0101 ~ 07: 40 PM $  export  PS1= "\e[46m\u@0101 \@ \$ \e[m"

下面是背景色的颜色代码表:

• 黑色 \e[40m
• 红色 \e[41m
• 绿色 \e[42m
• 棕色 \e[43m
• 蓝色 \e[44m
• 紫色 \e[45m
• 蓝绿色 \e[46m
• 灰色 \e[47m

如果你想在每次打开终端的时候提示符都显示为你想要设定的颜色的话,你需要把上面的设置保存到~/.bashrc文件中

sunshine @0101 ~ 07: 40 PM $  vi ~ /.bashrc
export  PS1= "\e[0;34m\u@0101 \@ \$ \e[m"
sunshine @0101 ~ 07: 40 PM $ . ~ /.bashrc  (使.bashrc中的设置在当前shell生效 )

现在我们就可以依照自己的喜好来配置属于自己的终端命令提示符了。
看看我的PS1变量吧:

PS1= "\e[0;32m\u@\h \e[0;33m\t `if [ $? = 0 ]; then echo \e[32m^_^ \w\e[0m; else echo \e[31mO_O \w\e[0m; fi` \e[0;31m\]\n$\e[0;37m"

在前面的那张图上可以看到一个笑脸,如果命令执行成功则会显示笑脸,如果执行失败则是O_O,如下图

我在PS1中通过判断上一个命令执行后的返回值来判断打印哪一种图形以及颜色

二、PS2—多行交互提示符

前面我们讲了很多关于PS1变量的属性,我们在大部分的时间都是和默认的命令行提示符打交道的。现在讲讲使用较少的PS2变量。
当我们的输入一个超过一行的命令时,我们可以使用“\”符号将命令分割成几行来执行,当使用了‘\’之后在第二行会出现一个新的提示符,如下

sunshine @0101 ~  11:09 $  sudo  apt-get install build-essential \
> libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg62-dev \
> libtiff4-dev cmake libswscale-dev libjasper-dev;

第二行开头的’>’就是多行提示符(Continuation Interactive Prompt),这个提示符就是由PS2变量设置的。

sunshine @0101 ~  11:09 $  export  PS2= "continue-> "
sunshine @0101 ~  11:09 $  sudo  apt-get install build-essential \
continue- > libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg62-dev \
continue- > libtiff4-dev cmake libswscale-dev libjasper-dev;

PS2变量也支持PS1中的属性(\h,\t等)以及各种颜色设置。

三、PS3—select命令使用的提示符

select命令是bash shell提供的一种循环,语法如下:

select varName  in list
do
    command1
    command2
    ....
    ......
    commandN
done

同时也可以结合 case命令:

select varName  in list
do
     case  $varName  in
        pattern1 )
            command1 ;;
        pattern2 )
            command2 ;;
        pattern1 )
            command3 ;;
         * )
             echo  "Error select option 1..3" ;;
     esac            
done

有关select详细的语法解释请见select loop
先来看一个简单的示例:

#!/bin/bash
select i  in mon tue wed  exit
do
     case  $i  in
        mon )  echo  "Monday" ;;
        tue )  echo  "Tuesday" ;;
        wed )  echo  "Wednesday" ;;
         exit )  exit ;;
     esac
done

保存到ps3.sh,运行一下:
sunshine @0101 ~  14: 44 $ . /ps3.sh
1 ) mon
2 ) tue
3 ) wed
4 )  exit
#? 1
Monday

可以看到提示我们选择的提示符号是#?,而这个提示符正是通过PS3(默认为#?)这个变量来设置的:

#!/bin/bash
PS3= "Select a day (1-4): "
select i  in mon tue wed  exit
do
     case  $i  in
        mon )  echo  "Monday" ;;
        tue )  echo  "Tuesday" ;;
        wed )  echo  "Wednesday" ;;
         exit )  exit ;;
     esac
done

保存到ps3.sh中,运行
sunshine @0101 ~  14: 44: 34 $ . /ps3.sh
1 ) mon
2 ) tue
3 ) wed
4 )  exit
select a day ( 1- 4 )1
Monday

不过,经过测试,PS3不支持PS1变量中的各种属性以及颜色的设置,这还是有些许遗憾的。

四、PS4—调试输出追踪

PS4变量定义的是在调试状态下执行shell脚本时的提示符,如下

sunshine @0101 ~  14: 44: 34 $  cat  >ps4.sh
set  -x
echo  "Demo script"
ls  -l  |  wc  -l
df  -h . /
sunshine @0101 ~  14: 44: 34 $ . /ps4.sh
++  echo  'Demo script'
Demo script
++  ls  -l  /etc /
++  wc  -l
244
++  df  -h . /
Filesystem            Size  Used Avail Use % Mounted on
10.0.0.3: /export /home /sunshine
                      499G  300G  199G   60 %  /home /sunhine
[当使用 set -x追踪输出时,这里显示的是默认的 "++" ]

通过设置PS4变量就可以改变默认的”++”,输出一些对脚本调试有用的信息。下面的shell脚本中的变量:
$0:脚本的名字
$LINENO:显示当前命令在脚本中的行数

sunshine @0101 ~  14: 44: 34 $  cat  >ps4.sh
export  PS4= "$0 $LINENO+: "
set  -x
echo  "Demo script"
ls  -l  |  wc  -l
df  -h . /
sunshine @0101 ~  14: 44: 34 $ . /ps4.sh
.. /02.ps4.sh  3+:  echo  'Demo script'
Demo script
.. /02.ps4.sh  4+:  ls  -l  /etc /
.. /02.ps4.sh  4+:  wc  -l
244
.. /02.ps4.sh  5+:  df  -h . /
Filesystem            Size  Used Avail Use % Mounted on
10.0.0.3: /export /home /sunshine
                      811G  490G  279G   64 %  /home /sunshine
[可以看到之前的 "++"已经变成了 "../02.ps4.sh 5+:",即 {脚本名 }. {行数 } ]

你可能感兴趣的:(linux)