我不确定这些转义序列是否严格符合“ANSI 转义序列”的定义,但实际上它们的使用方式几乎相同,所以我将它们包含在本章中。
非打印转义序列可用于在提示符中产生有趣的效果。要使用这些转义序列,您需要将它们括在\[和\](如第 3.4 节所述,告诉 Bash 在计算提示符大小时忽略此内容。如果未包含这些分隔符,则行编辑代码会将光标放置在错误的位置,因为它不知道提示符的实际大小。转义序列还必须以\033[在 Bash 版本 2 之前,或者以\033[或\e[在更高版本中开头。
如果您尝试在控制台中使用提示符更改 Xterm 的标题栏,则会在提示符中产生乱码。为避免这种情况,请测试 TERM 环境变量以确定您的提示符是否将在 Xterm 中。
function proml { case $TERM in xterm*) local TITLEBAR='\[\033]0;\u@\h:\w\007\]' ;; *) local TITLEBAR='' ;; esac PS1="${TITLEBAR}\ [\$(date +%H%M)]\ [\u@\h:\w]\ \$ " PS2='> ' PS4='+ ' } |
这是一个可以合并到~/.bashrc。然后可以调用函数名来执行该函数。该函数(如 PS1 字符串)存储在环境中。一旦通过函数设置了 PS1 字符串,您可以使用以下命令从环境中删除该函数unset proml。由于提示符无法从 Xterm 变为控制台,因此每次生成提示符时都不会测试 TERM 变量。我在提示符的定义中使用了续行标记(反斜杠),以允许它在多行上继续。这提高了可读性,使其更易于修改和调试。
创建此提示符的第一步是测试我们启动的 shell 是否为 xterm:如果是,则定义 shell 变量 (${TITLEBAR})。它由适当的转义序列和\u@\h:\w组成,这会将 <user>@<machine>:<working directory> 放置在 Xterm 标题栏中。这对于最小化的 Xterm 尤其有用,使其更容易识别。此提示符中的其他内容应该与我们之前创建的提示符中的内容类似。
像这样操作 Xterm 标题栏的唯一缺点是,当您登录到未设置标题栏技巧的系统时:Xterm 将继续显示来自之前已设置标题栏技巧的系统的信息。
来自 Charles Lepple 的建议 (<clepple at negativezero dot org>) 关于分别设置 Xterm 的窗口标题和相应图标的标题。他在 WindowMaker 下使用此方法,因为适用于 Xterm 的标题通常对于 64x64 图标来说太长。“\[\e]1;icon-title\007\e]2;main-title\007\]”。他说在提示符命令中设置此项,因为 “我尝试将字符串放在 PS1 中,但这会在某些窗口管理器下引起闪烁,因为它会导致在编辑多行命令时多次设置提示符(至少在 bash 1.4.x 下 - 我太懒了,没有完全探究其背后的原因)。” 我在 PS1 字符串中没有遇到任何问题,但没有使用任何多行命令。他还指出,它在 xterm、xwsh 和 dtterm 下有效,但在 gnome-terminal 下无效(gnome-terminal 仅使用主标题)。我还发现它在 rxvt 下有效,但在 kterm 下无效。