我正在开发一个同时连接到多个服务器的分布式系统。我正在处理的程序中没有手动启动任何内容,但这是手动重新创建错误的方法。
我启动 xterm,然后通过 SSH 连接到机器,如下所示:
ssh machine_1
在那里我在第一个 xterm 中启动另一个 xterm,如下所示:
xterm &
然后新的 xterm 窗口的标题栏类似于“用户名(在 machine_1 上)”
在这个 xterm 中,我通过 SSH 连接到另一台机器,如下所示:
ssh machine_2
但标题栏仍然是这样的:“用户名(在 machine_1 上)”
即使我已登录到 machine_2。我希望它显示“用户名(在 machine_2 上)”。完全删除括号也可以。
我尝试了 xtermset 但这不会影响括号。
答案1
xterm 或 machine_1 上的 shell 配置为设置终端标题以包含计算机名称。在 machine_2 上配置 shell,将终端标题设置为包含计算机名称。您还需要确保 machine_1 上的 shell 在 ssh 会话终止时重置标题。通常的方法是让 shell 在显示提示时重置终端标题。如果全屏文本模式应用程序在运行时设置终端标题,则这还有一个额外的好处,即可以将终端标题重置为合理的内容。
您可以通过显示来设置 xterm 的标题转义序列 \e]2;my title here\a
其中\e
是转义字符 ( \033
),\a
是响铃字符 ( \007
)。将此序列包含在您的 shell 提示符中。为了巴什,在您的 中添加这样一行~/.bashrc
:
PS1="\[\033]2;xterm on $HOSTNAME\a\]$PS1";;
反斜杠括号标点符号\[…\]
告诉 bash 里面的内容宽度为 0(如果省略括号,显示将出现乱码)。
如果您设置了该选项,则可以在提示字符串中包含变量和命令替换,以获得在每个命令之后更改的更多奇特标题promptvars
。
在 zsh 中,设置标题precmd
功能,在每个提示之前执行。
precmd () {
print -n "\e]2;xterm on $HOSTNAME in $PWD\a"
}
当您执行此操作时,您可以设置标题以preexec
包含正在运行的命令的名称。这是一种简单的方法,它对命令中不可打印的字符反应不佳:
preexec () {
print -nr $'\e]2;'"xterm on $HOSTNAME running $2"$'\a'
}