假设我将以下内容作为我的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
创建标题,但我不明白为什么。它似乎只是一些胡言乱语。
\e]0;
)的输出,并将\a
之前的所有内容作为终端窗口的标题。~/.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
),您可以在各处找到它们用于设置窗口标题。