关于 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表示转义符ESCprintf命令中,直接使用\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/MusicPROMPT_COMMAND
PROMPT_COMMAND 是 Bash shell 在显示 PS1 提示符前所执行的命令字符串。
export PROMPT_COMMAND="echo -n [$(date +%H:%M:%S)]"显示:[23:25:38] [user@~/workspace/temp] $
---- 整理自 Bash prompt basics