终端可以说是在Linux的使用中最常用到的工具了,通过设置PS1,PS2,PS3,PS4这四个环境变量,我们就可以个性化定制终端的提示符。
一、PS1—默认的交互提示符
默认情况下PS1为”\s-\v\$”,显示为
通过改变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+:",即
{脚本名
}.
{行数
}
]