配置 Zsh 终端:Prompt 命令提示符

本文介绍了在 macOS Terminal 终端中如何配置 zsh Prompt 命令提示符。

基本格式

Prompt 命令提示符的基本格式为:

1
2
3
PROMPT="%n@%m %1~ %#"

user@host ~/work %          <-- 输出

% 接单个字符为一个基本参数,输出特定信息。其中

  • %n:显示登录用户名。
  • %m:显示当前主机名,登录本地终端时显示本机名,登录远程服务器时显示服务器名。
  • %~:显示以 ~ 开头的当前工作目录,其中 ~ 为用户主目录 $HOME,数字指定显示路径的层数。
  • %#:当用户拥有管理员权限(root)时显示 #,否则显示 %

上述参数也可以在 Terminal 终端中使用 print -P 命令输出查看。

配置文件

在 Terminal 中直接为 PROMPT 环境变量赋值,可临时改变提示符格式。重启 Terminal 窗口或打开一个新的 Terminal 窗口,仍会启用系统默认的命令提示符格式。

注意
zsh 使用环境变量 PS1 来定义命令提示符的格式,我们这里使用的环境变量 PROMPT 为其同义词。因此某些文章会使用环境变量 PS1 来定义命令提示符的格式。

若希望每次开启一个新的 Terminal 窗口时使用同一套配置好的命令提示符,可在 zsh 配置文件 ~/.zshrc 中设置 PROMPT 参数。

基本参数

完整参数列表可在 zsh 用户手册 Prompt 章节 查看。

特殊字符

参数 输出 说明 补充
%% % 百分号 %
%) ) 右括号 )

登录信息

主要用于远程服务器终端的 Prompt 显示。

参数 输出 说明 补充
%l s001 用户登录的(tty)线程 剔除前缀 /dev/tty
%M host.local 完整主机名
%m host 简短主机名 % 后可接一个整数,指定截取完整主机名中第几个 . 之前的内容
%n user 登录用户名 $USERNAME
%y ttys001 用户登录的(tty)线程 剔除前缀 /dev/

终端状态

参数 输出 说明 补充
%# % # 当用户拥有管理员权限(root)时显示 #,否则显示 %
%? 0 在提示符之前执行的最后一个命令的返回状态 命令成功执行后返回 0
%/ %d /Users/user/work 当前工作目录 % 后可接一个整数,指定显示的路径层数,负数则从根目录开始显示
%~ ~/work 当前工作目录 ~ 代替用户主目录,% 后可接一个整数,指定显示的路径层数
%! %h 99 终端记录的历史命令数 历史命令存放在 ~/.zsh_history
%. %c %C work 当前工作目录的跟踪目录 % 后可接一个整数,指定显示的路径层数

日期时间

参数 输出 说明 补充
%D 23-09-26 yy-mm-dd 格式显示日期 %D{string} 字符串 stringstrftime 函数处理,自定义显示格式
%T 23:33 以 24 小时制显示当前时间
%t %@ 11:33PM 以 12 小时制显示当前时间 上午 AM,下午 PM
%* 23:33:33 以 24 小时制显示当前时间 包括秒数
%w Tue 26 day-dd 格式显示日期
%W 09/26/23 mm/dd/yy 格式显示日期

strftime 参数列表:

当前日期时间为:

1
2
3
print -P %D{%+}

Tue Sep 26 23:33:33 CST 2023            <-- 输出
  • 世纪
    参数 输出 说明 补充
    %C 20 两位数世纪(00-99)
  • 年份
    参数 输出 说明 补充
    %G 2023 四位数年份(2023) 每周首日为周一
    %g 23 两位数年份(00-99) 每周首日为周一
    %Y 2023 四位数年份(2023)
    %y 23 两位数年份(00-99)
  • 月份
    参数 输出 说明 补充
    %B September 月份全称
    %b %h Sep 月份缩写
    %m 09 两位数月份(01-12)
  • 周数
    参数 输出 说明 补充
    %U 39 两位数周数(00-53) 每周首日为周日
    %V 39 两位数周数(01-53) 每周首日为周一
    %W 39 两位数周数(00-53) 每周首日为周一
  • 星期
    参数 输出 说明 补充
    %A Tuesday 星期全称
    %a Tue 星期缩写
    %u 2 一位数星期(1-7) 每周首日为周一
    %w 2 一位数星期(0-6) 每周首日为周日
  • 日期
    参数 输出 说明 补充
    %d 26 两位数日期(01-31)
    %e 26 日期(1-31) 空格补位
    %j 269 三位数日期(001-366)
  • 小时
    参数 输出 说明 补充
    %H 23 24 小时制两位数小时(00-23)
    %I 11 12 小时制两位数小时(01-12)
    %k 23 24 小时制小时(0-23) 空格补位
    %l 11 12 小时制小时(1-12) 空格补位
    %p PM 12 小时制指示 AMPM
  • 分钟
    参数 输出 说明 补充
    %M 33 两位数分钟(00-59)
  • 秒钟
    参数 输出 说明 补充
    %S 33 两位数秒钟(00-59)
  • 时区
    参数 输出 说明 补充
    %Z CST 时区缩写
    %z +0800 所在时区与 UTC 的间隔
  • 格式
    参数 输出 说明 补充
    %n 换行
    %t Tab 制表符
    %% % 百分号
    %-* 3 无补位
    %_* _3 空格补位
    %0* 03 0 补位
  • 预设
    参数 输出 说明 补充
    %D 09/26/23 %m/%d/%y
    %F 2023-09-26 %Y-%m-%d
    %R 23:33 %H:%M
    %r 11:33:33 PM %I:%M:%S %p
    %T 23:33:33 %H:%M:%S
    %v 26-Sep-2023 %e-%b-%Y
  • 本地
    参数 输出 说明 补充
    %X 23:33:33 本地时间格式
    %x 09/26/23 本地日期格式
    %+ Tue Sep 26 23:33:33 CST 2023 本地时间与日期格式

视觉效果

基本格式为:

1
PROMPT="%F{red}Text Word%f"

输出效果为:

Text Word

| 开始 | 结束 | 输出 | 说明 |
|:----:|:----:|:----:|:----:|
|`%B`|`%b`|**Text Word**|粗体|
|`%E`|||清除至行末|
|`%U`|`%u`|<u>Text Word</u>|下划线|
|`%S`|`%s`|<mark>Text Word</mark>|高亮,若定义了字体颜色,则高亮背景会继承字体颜色|
|`%F{color}`|`%f`|<span style="color:red;">Text Word</span>|前景(字体)颜色|
|`%K{color}`|`%k`|<span style="background-color:red;">Text Word</span>|背景颜色|

可选用的颜色

  • 一般各种终端都接受的常用颜色名: blackredgreenyellowbluemagentacyan 以及 white
  • 在终端中输入 echotc Co,可查看终端支持的颜色总数,如 256,表示终端支持(0-255)的颜色编号。
  • 在 Terminal 终端中输入 echo $TERM 也可确认,如输出 xterm-256color

【参考】

条件判断

1
%(x.true-text.false-text)
  • x 所指代的判断条件为真时,选取 true-text 片段,否者选取 false-text 片段。
  • 其中 x 后的分隔符 . 可用任意字符替代,但需保证 true-text 片段中无相应字符。
  • x 前可有整数 n(默认 n=0),与具体判断符 x 配合进行条件判断。
  • true-textfalse-text 中可包含上述各种基本参数,也可嵌套条件判断。

一些简单的条件判读符 x 如下,详细列表请参考 zsh 用户手册 Prompt 章节

判断符 真值条件
! 终端以管理员权限运行(%# = %(!.#.%%)
? 上一个命令的结束状态为 n(成功执行的命令的结束状态为 0)
C / 当前工作目录的绝对路径含至少 n 层(根目录 / 为 0 层)
c . ~ 当前工作目录的路径含至少 n 层(用户主目录以 ~ 代替)
D 当前月份为 n(1 月为 0)
w 当前星期为 n(周日为 0)
d 当前日期为 n (1-31)
T 当前小时数为 n(0-24)
t 当前分钟数为 n(0-59)

右侧提示符

可自定义 RPROMPT 变量在终端右侧显示提示,其语法与 PROMPT 相同。

1
2
3
4
PROMPT="%2~ %#"
RPROMPT="%*"

~/work %                                                         23:33:33

版本控制

zsh 集成了一些基本的版本控制系统,具体可参考Moving to zsh, part 6 – Customizing the zsh Prompt

【参考】

一些大型的 zsh 主题项目,如 oh-my-zsh 以及 prezto 等,都集成了能够显示详细 Git 版本信息的模组。


【参考】

0%