# 命令提示符

用户进入 Bash 以后，Bash 会显示一个命令提示符，用来提示用户在该位置后面输入命令。

## 环境变量 PS1

命令提示符通常是美元符号`$`，对于根用户则是井号`#`。这个符号是环境变量`PS1`决定的，执行下面的命令，可以看到当前命令提示符的定义。

```bash
$ echo $PS1
```

Bash 允许用户自定义命令提示符，只要改写这个变量即可。改写后的`PS1`，可以放在用户的 Bash 配置文件`.bashrc`里面，以后新建 Bash 对话时，新的提示符就会生效。要在当前窗口看到修改后的提示符，可以执行下面的命令。

```bash
$ source ~/.bashrc
```

命令提示符的定义，可以包含特殊的转义字符，表示特定内容。

- `\a`：响铃，计算机发出一记声音。
- `\d`：以星期、月、日格式表示当前日期，例如“Mon May 26”。
- `\h`：本机的主机名。
- `\H`：完整的主机名。
- `\j`：运行在当前 Shell 会话的工作数。
- `\l`：当前终端设备名。
- `\n`：一个换行符。
- `\r`：一个回车符。
- `\s`：Shell 的名称。
- `\t`：24小时制的`hours:minutes:seconds`格式表示当前时间。
- `\T`：12小时制的当前时间。
- `\@`：12小时制的`AM/PM`格式表示当前时间。
- `\A`：24小时制的`hours:minutes`表示当前时间。
- `\u`：当前用户名。
- `\v`：Shell 的版本号。
- `\V`：Shell 的版本号和发布号。
- `\w`：当前的工作路径。
- `\W`：当前目录名。
- `\!`：当前命令在命令历史中的编号。
- `\#`：当前 shell 会话中的命令数。
- `\$`：普通用户显示为`$`字符，根用户显示为`#`字符。
- `\[`：非打印字符序列的开始标志。
- `\]`：非打印字符序列的结束标志。

举例来说，`[\u@\h \W]\$`这个提示符定义，显示出来就是`[user@host ~]$`（具体的显示内容取决于你的系统）。

```bash
[user@host ~]$ echo $PS1
[\u@\h \W]\$
```

改写`PS1`变量，就可以改变这个命令提示符。

```bash
$ PS1="\A \h \$ "
17:33 host $
```

注意，`$`后面最好跟一个空格，这样的话，用户的输入与提示符就不会连在一起。

## 颜色

默认情况下，命令提示符是显示终端预定义的颜色。Bash 允许自定义提示符颜色。

使用下面的代码，可以设定其后文本的颜色。

- `\033[0;30m`：黑色
- `\033[1;30m`：深灰色
- `\033[0;31m`：红色
- `\033[1;31m`：浅红色
- `\033[0;32m`：绿色
- `\033[1;32m`：浅绿色
- `\033[0;33m`：棕色
- `\033[1;33m`：黄色
- `\033[0;34m`：蓝色
- `\033[1;34m`：浅蓝色
- `\033[0;35m`：粉红
- `\033[1;35m`：浅粉色
- `\033[0;36m`：青色
- `\033[1;36m`：浅青色
- `\033[0;37m`：浅灰色
- `\033[1;37m`：白色

举例来说，如果要将提示符设为红色，可以将`PS1`设成下面的代码。

```bash
PS1='\[\033[0;31m\]<\u@\h \W>\$'
```

但是，上面这样设置以后，用户在提示符后面输入的文本也是红色的。为了解决这个问题， 可以在结尾添加另一个特殊代码`\[\033[00m\]`，表示将其后的文本恢复到默认颜色。

```bash
PS1='\[\033[0;31m\]<\u@\h \W>\$\[\033[00m\]'
```

除了设置前景颜色，Bash 还允许设置背景颜色。

- `\033[0;40m`：蓝色
- `\033[1;44m`：黑色
- `\033[0;41m`：红色
- `\033[1;45m`：粉红
- `\033[0;42m`：绿色
- `\033[1;46m`：青色
- `\033[0;43m`：棕色
- `\033[1;47m`：浅灰色

下面是一个带有红色背景的提示符。

```bash
PS1='\[\033[0;41m\]<\u@\h \W>\$\[\033[0m\] '
```

## 环境变量 PS2，PS3，PS4

除了`PS1`，Bash 还提供了提示符相关的另外三个环境变量。

环境变量`PS2`是命令行折行输入时系统的提示符，默认为`> `。

```bash
$ echo "hello
> world"
```

上面命令中，输入`hello`以后按下回车键，系统会提示继续输入。这时，第二行显示的提示符就是`PS2`定义的`> `。

环境变量`PS3`是使用`select`命令时，系统输入菜单的提示符。

环境变量`PS4`默认为`+ `。它是使用 Bash 的`-x`参数执行脚本时，每一行命令在执行前都会先打印出来，并且在行首出现的那个提示符。

比如下面是脚本`test.sh`。

```bash
#!/bin/bash

echo "hello world"
```

使用`-x`参数执行这个脚本。

```bash
$ bash -x test.sh
+ echo 'hello world'
hello world
```

上面例子中，输出的第一行前面有一个`+ `，这就是变量`PS4`定义的。