我有一个调试陷阱,每次在 bash 中输入命令时都会运行,该陷阱设置窗口标题以指示正在运行的命令。我省略了所有配置细节并将其归结为:
export PS1="\[\e]0;$GENERATED_WINDOW_TITLE\a\]$GENERATED_PROMPT"
这工作得非常好,只有一个障碍:如果 bash shell 运行在不支持此功能的环境中,则 GENERATED_WINDOW_TITLE 会随每个提示一起打印在屏幕上。每当我从非 X 终端运行 bash 时都会发生这种情况。
bash 如何判断这个转义序列是否受支持?
答案1
我认为没有 terminfo 功能可以做到这一点。在实践中,测试 的值TERM
应该足够了。这就是我在.bashrc
和中所做的.zshrc
,我不记得这是一个问题。
case $TERM in
(|color(|?))(([Ekx]|dt|(ai|n)x)term|rxvt|screen*)*)
PS1=$'\e\]0;$GENERATED_WINDOW_TITLE\a'"$PS1"
esac
答案2
有一个 terminfo 条目被(滥用)用于此目的,并且已经成为多个错误报告的主题,建议将其应用于各种终端描述。参考terminfo(5)
:
has_status_line hs hs has extra status
line
from_status_line fsl fs return from status
line
to_status_line tsl ts move to status line,
column #1
这些在本节中进行了解释状态行:
一些带有状态行的终端需要特殊的序列来访问状态行。这些可以表示为具有单个参数的字符串
tsl
它将光标带到状态行上给定的零源列。
顺便说一句,您可能能够使用的唯一支持所记录功能的终端模拟器是kterm
。
一个扩大会是合适的。该screen
程序记录了一个可能的选择(但在检查了它的内容之后做有了这个功能,这个想法就被放弃了)。 ncurses 提供了一个扩展,该扩展已在终端数据库中几年,记录在关于XTerm 扩展:
# TS is a string capability which acts like "tsl", but uses no parameter and
# goes to the first column of the "status line".
最终,任何使用该功能的东西都会继承自xterm+sl
:
# These building-blocks allow access to the X titlebar and icon name as a
# status line. There are a few problems in using them in entries:
#
# a) tsl should have a parameter to denote the column on which to transfer to
# the status line.
# b) the "0" code for xterm updates both icon-title and window title. Some
# window managers such as twm (and possibly window managers descended from
# it such as tvtwm, ctwm, and vtwm) track windows by icon-name. Thus, you
# don't want to mess with icon-name when using those window managers.
#
# The extension "TS" is preferable, because it does not accept a parameter.
# However, if you are using a non-extended terminfo, "TS" is not visible.
(ncurses)tput
程序可以测试这个功能。