自定义bash提示符 -- Bash prompt basics

Adam posted @ Sun, 23 Sep 2012 01:43:50 +0800 in Linux with tags bash linux , 8171 readers
Bash中内置了PS1/PS2/PS3/PS4及PROMPT_COMMAND共5个变量,用于控制Bash shell中提示符的内容和格式。
例如一般意义上默认的:user@localhost~ $,本文的意图是让我们能控制、更改它。
 
如果你们需要在全局设置这些选项,请前往:
(全局的系统设置文件:)/etc/profile, /etc/bashrc
(用户的系统设置文件:)~/.bash_profile , ~/.bash_login , ~/.profile , ~/.bashrc, ~/.bash_logout

PS设置的实例:

  1. export PS1='\u@\h \w \$ ' (普通示例)
  2. export PS1='\[\e[0;32m\][\u@\h \w \$]\[\e[m\]' (颜色示例)
  3. export PS1='\t: ' (时间示例)
  4. export PS1='\u@\h [\$(ls | wc -l)]:\$ ' (显示当前目录行下文件数量)

PS1/PS2/PS3/PS4及PROMPT_COMMAND的意义:

  • PS1 :命令行提示符
  • PS2 :延续命令行提示符
  • PS3 :脚本中select语句提示符
  • PS4 :调试模式下脚本命令提示符("set -x"提示所执行命令)
  • PROMPT_COMMAND :Bash shell在显示PS1提示符前所执行的命令

1. 提示符转义码

Bash shell允许用户在提示符中使用以下转义符号:

转义符号
意义
\a
响铃(ASCII 0x07)
\d
日期(格式:星期 月 日)
\D{format}
以指定格式显示当前日期(格式字符串将传递给strftime()函数,若为空则使用本机标准格式)
\e
ESC,(ASCII 0x1B)
\h
本机名称(从左至右直到遇到'.')
\H
本机名称
\j
shell当前正在处理任务号
\l
shell终端设备基本名称
\n
换行(ASCII 0x0A)
\r
回车(ASCII 0x0D)
\s
shell名,$0的基本名
\t
当前时间,24小时制,格式为HH:MM:SS
\T
当前时间,12小时制,格式为HH:MM:SS
\@
当前时间,12小时制,格式为HH:MM am|pm
\A
当前时间,24小时制,格式为HH:MM
\u
当前用户名
\v
Bash版本
\V
Bash发行号(版本+补丁级别)
\w
当前路径,$HOME将会被缩写为'~'
\W
当前路径的基本名(最后一级文件夹),$HOME处理同上
\!
当前命令的命令历史记录编号
\#
当前命令的编号
\$
如果当前用户ID为0(超级用户),则显示'#';否则显示'$'
\nnn
八进制数值nnn对应的ASCII字符
\\
反斜杠'\'
\[
标识不打印字符串的开始
\]
标识不打印字符串的结束

2. 在shell中使用不同颜色输出文字

在shell中,可以通过转义序列[<attr>;<fgcolor>;<bgcolor>m设置文字的显示属性(可选择分别或组合设置显示属性/前景色/背景色)。如果要还原字符显示方案(显示属性/前景色/背景色)为系统默认,可以使用'\e[m'完成。
attr控制文字的修饰效果(终端并一定全部支持)
0:默认; 1:加亮; 2:变暗; 4:下划线; 5:闪烁; 7:反色显示; 8:隐藏文字; 9:删除线
fgcolor控制文本颜色
30:黑色; 31:红色; 32:绿色; 33:黄色; 34:蓝色; 35:紫色; 36:青色; 37:白色
bgcolor控制文本颜色
40:黑色; 41:红色; 42:绿色; 43:黄色; 44:蓝色; 45:紫色; 46:青色; 47:白色

显示属性/前景色/背景色定义在不同的数值区间,这样作的好处是不用显示指明颜色的作用域,系统也会从颜色数值推断出用户想要设置的究竟是属性/前景色/背景色。例如,'\e[9;41m'是要设置显示属性和背景色,保持前景色不变;'\e34m‘仅设置前景色。

#!/bin/bash

for attr in 0 1 2 4 5 7 8 9; do
    for fgcolor in 30 31 32 33 34 35 36 37; do
        for bgcolor in 40 41 42 43 44 45 46 47; do
             printf '\e[%s;%s;%sm %1s;%02s;%02s ' $attr $fgcolor $bgcolor $attr $fgcolor $bgcolor
        done
        printf '\e[0;37;40m\n'
    done
    printf '\n'
done
转义字符ESC的输入
  1. shell中,如果想输入ESC(转义)字符,可以先按ctrl+v键后,再按下ESC键,系统会显示出'^['表示转义字符输入完成
  2. echo命令中,使用-e选项允许转义字符后,可以输入'\033'或'\e'表示转义符ESC
  3. printf命令中,直接使用'\033'即可表示转义符ESC

3. 光标控制

同样,通过转义序列我们可以控制光标移动到指定位置:
转义序列 跳转位置
\033[(L);(C)H
\033[(L);(C)f
跳转至第L行第C列
\033[(N)A 光标向上移动n行
\033[(N)B 光标向下移动n行
\033[(N)C 光标向前移动n列
\033[(N)D 光标向后移动n列
\033[2J 清除屏幕并移动至(0,0)
\033[K 删除至行尾
\033[s 保存光标当前位置
\033[u 恢复光标至保存位置

4. 设置PS1

PS1控制着终端中系统默认提示符的格式 (一般系统默认为'\u@\h:\w \$ ')。我们可以在PS1控制字符串使用Bash预定义的转义符号加入如用户/当前路径/主机名等信息,还可以使用转义字符串控制提示符的颜色。

export PS1='\[\e[0;32m\][\u@\h \w \$]\[\e[m\]'

  • 值得说明的是在颜色的(以及任何你所使用的转义字符串的)周围我们需要用'\['和'\]'来标记他们是不可见字符,否则会造成第二行重复输入在本行。

5. 设置PS2

PS2控制终端中命令延续行的格式,一般系统默认为单字符'>'。和PS1一样,可以使用字符/预定义转义字符/转义序列等进行定制。

export PS2='\[\e[0;32m\]~>\[\e[m\]'

比如你可以通过以下命令来实验:
$ ls \
~> -la /etc/

其中~>为我们的PS2的设置,它替换了一般意义上默认的'>'。

 

6. 设置PS3

PS3用于控制shell中提示用户进行选择的提示符,一般系统默认为'#?'。
[user @ dir] $ cat ps3test.sh
select i in mon tue wed thu fri exit
do
case $i in
mon) echo "Monday";;
tue) echo "Tuesday";;
wed) echo "Wednesday";;
thu) echo "Thusday";;
fri) echo "Friday";;
exit) exit;;
esac
done
[user @ dir] $ ./ps3test.sh
1) mon
2) tue
3) wed
4) thu
5) fri
6) exit
#? 6
[user @ dir] $ export PS3='Enter your choice: '
[user @ dir] $ ./ps3test.sh
1) mon
2) tue
3) wed
4) thu
5) fri
6) exit
Enter your choice: 6

 

7. 设置PS4

调试模式下脚本命令提示符,用以将命令和命令执行结果区分开。系统默认为'+'。同样,可以使用各种字符/预定义符号/转义控制序列去设置PS4,此外,系统还提供了两个可用于PS4的变量'$0'和'$LINENO',分别表示脚本名和当前行号。
[user @ dir] $ cat ps4test.sh
#!/bin/bash
export PS4='\[\e[0;37;44m\]$LINENO@$0:\[\e[m\]'
set -x
ls -l ~ | wc -l
du -s ~/Music

[user @ dir] $ ./ps4test.sh
5@./ps4test.sh:ls -l /home/user
5@./ps4test.sh:wc -l
13
6@./ps4test.sh:du -s /home/user/Music
4 /home/user/Music

8. PROMPT_COMMAND

PROMPT_COMMAND是Bash shell在显示PS1提示符前所执行的命令字符串。
 
export PROMPT_COMMAND="echo -n [$(date +%H:%M:%S)]"
显示:[23:25:38][user@~/workspace/temp] $
 

参考链接:

http://linuxconfig.org/Bash_prompt_basics

http://www.thegeekstuff.com/2008/09/bash-shell-take-control-of-ps1-ps2-ps3-ps4-and-prompt_command/


Login *


loading captcha image...
(type the code from the image)
or Ctrl+Enter