Bash PS1窗口标题是什么?

6

假设我将以下内容作为我的PS1提示符:

PS1='\[\e]0;TITLE\a\]\n\[\e[32m\]\u@\h \[\e[33m\]\w\[\e[0m\]\n\$ '

它会给我这个提示

Steven@Steven-PC ~
$

窗口标题为TITLE

我理解这一部分

\e]0;TITLE\a

创建标题,但我不明白为什么。它似乎只是一些胡言乱语。
2个回答

10
终端仿真器会寻找包含特定代码(\e]0;)的输出,并将\a之前的所有内容作为终端窗口的标题。

3
你能否也添加一个参考文献? - nikhilweee
请查看我的回答,其中包含参考资料、各种链接以及更详细的见解。 - undefined

1
我也很好奇如何设置终端仿真器窗口的标题的内部工作原理,但不幸的是,我找不到任何关于如何避免使用原始转义序列来实现这一目的的指导或见解。这让我更加好奇。
使用晦涩的原始转义序列一点也不好,这也是创建terminfo数据库的原因之一,所以我有动力详细研究这一切,以在我的~/.bashrc中实现设置窗口标题,而不使用原始转义序列,并最终撰写这篇答案并分享我的发现。
以下是我~/.bashrc的摘录,展示了我实现设置窗口标题的bash代码,同时不使用原始转义序列:
if [[ "${TERM}" != 'linux' ]]; then
        # Force the terminal type, to work around GUI terminal
        # emulators that set $TERM wrongly to a type that doesn't
        # support status line, e.g. "xterm-256color"

        SL_TERM='xterm-pcolor'
        SL_START="$(TERM=${SL_TERM}; tput tsl)"
        SL_END="$(TERM=${SL_TERM}; tput fsl)"

        SL_CMD='${USER}@${HOSTNAME%%.*} ${PWD/#${HOME}/\~}'
        SL_CMD+='$(STATUS=${?}; [[ ${STATUS} != 0 ]] && echo -n " [ERROR: ${STATUS}]")'

        PROMPT_COMMAND="echo -n \"${SL_START}${SL_CMD}${SL_END}\""
        unset SL_TERM SL_START SL_END SL_CMD
else
        unset PROMPT_COMMAND
fi

关键在于使用tput(1)工具生成所需的转义序列,使用描述各种终端和终端仿真器功能的terminfo(5)数据库。正如您在上面的bash代码的注释中所看到的,一些终端仿真器实际上会有一些问题,但这可以很容易地解决。
我们感兴趣的两个终端功能是tsl(移动到状态行,列#1)和fsl(从状态行返回)。这两个功能实际上会产生原始的转义序列\033]0;\e]0;)和\007\a),您可以在各处找到它们用于设置窗口标题。
显然,Linux虚拟控制台没有状态行功能,所以上述代码在shell运行时不会更新状态行。可以通过使用infocmp(1M)来轻松检查每个终端类型的功能,例如运行infocmp -I linux,infocmp -I xterm-256color或infocmp -I xterm-pcolor。
这里还有一些比较难找到的XTerm控制序列参考版本,按可读性降序排列:2023版本(HTML),1994版本(PDF)和2005版本(HTML)。
希望这能帮助你对整个事情有所了解。真的让我很好奇为什么之前没有人解释过这个,至少在某个地方。也许只是我的谷歌搜索能力不够强大。:)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接