2017年8月

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