我有以下 shell 脚本函数这个网站这允许我更改 Putty 和 Cygwin 中的标题。在连接到 Linux 主机的 Putty 中,它会更改标题并保持提示不变。但在 Cygwin 中,它更改了标题,然后提示符变成了纯粹的 $ 或 # 符号。
我想为 Cygwin 创建一个版本,更改标题但保留提示不变。 (我知道在在这里发布之前我应该尝试自己创建一个,但我总是发现提示字符串令人困惑。)
编辑: 更具体地说,在 Cygwin 中,我喜欢默认提示符user@hostname
后跟当前目录。我想保留那个提示。
编辑二: 我并不关心默认 Cygwin 提示符的颜色是否被保留,如果这会让事情变得更容易的话。我至少想要提示中的目录。
这是我所拥有的:
function wtitle {
if [ "$TERM" == "xterm" ] ; then
# Remove the old title string in the PS1, if one is already set.
PS1=`echo $PS1 | sed -r 's/^\\\\\[.+\\\\\]//g'`
export PS1="\[\033]0;$1 - \u@\h:\w\007\]$PS1"
else
echo "You are not working in xterm. I cannot set the title."
fi
}
`
答案1
请加
PS1='\[\e]0;\w\a\]\n\[\e[32m\]\u@\h \[\e[33m\]\w\[\e[0m\]\$'
作为 ~/.bashrc 中的最后一行并再次登录或只是运行
source ~/.bashrc
答案2
我认为OP要求的是设置终端模拟器运行的窗口的标题。我对 PS1 的引用感到困惑,因为我只需运行这个就能实现这一点......
printf '\e]2;%s\a' "My Title"
至少这适用于 mintty 2.7 (+ Cygwin 2.8)。 (也许自从问题最初发布以来,情况已经发生了变化。)
答案3
如果登录到某个 SSH 服务器后标题根本没有更新,请尝试从 cygwin 安装 OpenSSH 软件包。
对我来说,cygwin 使用的是 OpenSSH 的某些 Windows 10 Pro 内部版本,该版本不会通过 SSH 堆栈将标题转义字符传回。
发布此内容可能是为了防止有人花一个小时在这上面
答案4
你有两个问题:
- 您应该始终引用 shell 变量,除非您有充分的理由不这样做,并且您确定您知道自己在做什么。
echo $PS1
应该如此echo "$PS1"
。这会导致提示丢失末尾的空格;即,它变成$
而不是$
。在某些情况下,它可能会导致其他问题。 Bash 使用
\[
...\]
来分隔转义序列;即,不作为提示的一部分出现在屏幕上的字符。这包括设置窗口标题的转义序列,还包括在(可见)提示内更改颜色的转义序列。你的脚本确实s/ ^ \\\\\[ .+ \\\\\] //g
(为了清楚起见添加了空格)。乍一看,这似乎是试图删除全部
\[
……\]
序列。 (其实有二它不这样做的原因。)主要问题是.+
匹配最长的可能字符串任何人物。这意味着它会删除从第\[
一个序列的开头\]
到最后一个序列的结尾的所有内容\[
-\]
换句话说,直到最后一个颜色变化为止的所有内容。我们只想删除转义序列来设置窗口标题。我们通常会改变
.+
(其中.
火柴任何字符)到除 之外的字符串]
。但这是因为设置窗口标题的转义序列这一事实而变得复杂包含a]
,所以我们需要通过 第二]
:s/^\\\\\[[^]]+][^]]+\\\\\]//g
我稍后会在上下文中展示这一点......
- 这不是问题本身,但是
`
……`
是过时的语法。建议您使用$(
...)
代替。有些帖子似乎表明它们在功能上是可以互换的。他们不是;适用不同的引用/转义规则。幸运的是,在这种情况下这对我们有利。当我们切换到$(
...时)
,我们可以更改sed
命令以使用更少的反斜杠。 - 另一个问题:
function
不鼓励使用关键字。请参阅下文了解首选语法。
因此,将以上所有内容放在一起,我们得到:
wtitle() {
if [ "$TERM" == "xterm" ] ; then
# Remove the old title string in the PS1, if one is already set.
PS1=$(echo "$PS1" | sed -r 's/^\\\[[^]]+][^]]+\\\]//g')
export PS1="\[\033]0;$1 - \u@\h:\w\007\]$PS1"
else
echo "You are not working in xterm. I cannot set the title."
fi
}
可以说,即使这样也并不完美。它取决于PS1
将窗口标题转义序列作为第一件事的现有值。