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版权协议,转载请附上原文出处链接和本声明。