关于 bash prompt 的相关知识
PS1/PS2/PS3/PS4 及 PROMPT_COMMAND 的意义
PS1
: 命令行提示符PS2
: 延续命令行提示符PS3
: 脚本中 select 语句提示符PS4
: 调试模式下脚本命令提示符 (set -x
提示所执行命令)PROMPT_COMMAND
: Bash shell 在显示PS1
提示符前所执行的命令
提示符转义码
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 字符\\
: 反斜杠\
\[
: 标识不打印字符串的开始\]
: 标识不打印字符串的结束
在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
仅设置前景色。
转义字符ESC的输入:
- shell 中,如果想输入
ESC
(转义) 字符,可以先按ctrl+v
键后,再按下ESC
键,系统会显示出^[
表示转义字符输入完成 echo
命令中,使用-e
选项允许转义字符后,可以输入\033
或\e
表示转义符ESC
printf
命令中,直接使用\033
即可表示转义符ESC
光标控制
设置 PS1
PS1
控制着终端中系统默认提示符的格式 (一般系统默认为 \u@\h:\w \$
)。我们可以在PS1控制字符串使用 Bash 预定义的转义符号加入如用户/当前路径/主机名等信息,还可以使用转义字符串控制提示符的颜色。
export PS1='\[\e[0;32m\][\u@\h \w \$]\[\e[m\]'
设置 PS2
PS2
控制终端中命令延续行的格式,一般系统默认为单字符>
。和 PS1
一样,可以使用字符/预定义转义字符/转义序列等进行定制。
export PS2='\[\e[0;32m\]~>\[\e[m\]'
设置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
设置 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
PROMPT_COMMAND
PROMPT_COMMAND
是 Bash shell 在显示 PS1
提示符前所执行的命令字符串。
export PROMPT_COMMAND="echo -n [$(date +%H:%M:%S)]"
显示:[23:25:38] [user@~/workspace/temp] $
---- 整理自 Bash prompt basics