Bash的功能——控制提示符

Bash打印每个主提示(PS1)之前,都会检查变量PROMPT_COMMAND的值。如果设置了PROMPT_COMMAND并且值非空,则执行该命令。

$ PROMPT_COMMAND='echo hello word'
hello word
$
hello word
$
hello word
$

交互式Shell里,Bash会在读取命令的第一行之前展开并显示PS1,并在读取多行命令的第二行及后续行之前会展开并显示PS2. Bash在读取命令之后但在执行命令之前会展开并显示PS0.
PS1的默认值是’\s-\v$ ’
PS2的默认值是’> ’
PS3的值用作select命令的提示。 如果未设置此变量,则select命令会提示’#? ’
PS4的值,在设置了-x选项时,会在回显命令行之前打印。 必要时,将PS4值的第一个字符会被复制多次,以指示多个间接级别。 默认值为’+ '。

$ set -x
$ echo abc # PS1
+ echo abc # PS4
$ PS0='## '
+ PS0='## '
$ echo abc
## + echo abc # PS0
abc
$ if [[ abc = abc ]];
> then echo abc; # PS2
> fi
## + [[ abc = abc ]]
+ echo abc
abc
$ select var in a b c d; do echo $var;break; done
## + select var in a b c d
1) a
2) b
3) c
4) d
#? 1 # PS3
+ echo a
a
+ break

在PS0, PS1, PS2, PS3, PS4变量里可以使用的特殊含义的字符如下:

  • \a 响铃字符
  • \d 当前日期,格式为“星期 月 日”
$ PS1="\d$ "
Sun Jun 28$ 
  • \D{format} 用C函数strftime按照format格式化当前日期和时间的结果作为提示符。如果不提供format,则为当前语言环境的时间格式。注意,{}不能省略。对于strftime函数的格式化字符串,参考C library function - strftime()
$ PS1="\D{}$ "
14:30:26$ 
$ PS1="\D{%Y-%m-%dT%H:%M:%S}$ "
2020-06-28T14:36:22$
  • \e 转义字符
  • \h 主机名,只到第一个’.’ 例如,如果主机名为abc.zuora.com,则\h表示abc
  • \H 完整的主机名
  • \j Shell当前管理的作业数
  • \l Shell终端设备名称的basename
  • \n 换行符
  • \r 回车符
  • \s Shell的名称,$0的basename(最后一个 / 之后的部分)
  • \t 当前时间的24小时制HH:MM:SS格式
  • \T 当前时间的12小时制HH:MM:SS格式
  • @ 当前时间的12小时制am/pm格式
  • \A 当前时间的24小时制HH:MM格式
  • \u 当前用户的用户名
  • \v Bash的版本号 (e.g., 2.00)
  • \V Bash的发布号,即版本号+补丁号 (e.g., 2.00.0)
  • \w 当前工作目录,$HOME会被缩写为~,目录的显示层级由变量PROMPT_DIRTRIM控制
$ PS1="\w\$ "
~$ cd /etc/apt
/etc/apt$ PROMPT_DIRTRIM=1
.../apt$
  • \W $PWD的basename, $HOME会被缩写为~
  • \! 当前命令的历史序号
  • # 当前命令的命令序号
  • \$ 如果当前用户的uid是0, 显示为#, 否则显示为$.
  • \nnn ASCII码为八进制nnn的字符
$ PS1="\346\210\221\347\210\261\345\214\227\344\272\254\345\244\251\345\256\211\351\227\250\$ "
我爱北京天安门$
  • \\ 反斜杠
  • \[ 和 \] 之间是非打印字符序列,可用于嵌入终端控制字符序列

版权声明:本文为zjysource原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。