bash 脚本如何检测对窗口标题转义字符的支持?

bash 脚本如何检测对窗口标题转义字符的支持?

我有一个调试陷阱,每次在 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程序可以测试这个功能。

相关内容