在Ubuntu 16中,我如何在Gnome终端中更改bash提示符而不会弄乱终端标题?

我不喜欢所有冗长的目录路径占据我的终端空间,所以我通过一个Python脚本将它们截断。我已经编辑了.bashrc文件,并将PS1替换为
export PROMPT_COMMAND='PS1="$(python /home/vinay/bash_promt.py)"'.

当我这样做时,终端的标题就不再起作用了。它只是显示为“终端”,这很烦人。我可以通过在bash中运行以下命令手动更改标题:
PROMPT_COMMAND='echo -ne "\033]0;CUSTOM TITLE\007"'

有没有办法将终端的标题设置为我在bash中设置的自定义提示符?

3你知道有一个PROMPT_DIRTRIM变量可以控制目录组件的数量,对吗? - steeldriver
此外,fish shell默认就能实现这个功能(而且还有很多其他很酷的特性)。 - Andrea Lazzarotto
3个回答

对于gnome-terminal,终端标题是通过在/etc/profile.d/vte-2.91.sh中定义的PROMPT_COMMAND来设置的。
在这个脚本中,PROMPT_COMMAND有两个作用:
1. 使用OSC 0转义序列(\033]0;NEW_TITLE\007)更改终端标题, 2. 使用OSC 7转义序列(\033]7;NEW_CURRENT_DIRECTORY\007)更改终端的当前目录(这部分被封装到__vte_osc7函数中)。
如果你从PROMPT_COMMAND中移除第二个作用,那么新打开的终端窗口或标签页将不会打开在你之前所在的目录。很可能你不希望出现这种情况。
因此,在你的shell启动脚本中,在引入vte-2.91.sh之后,你需要构建一个类似于vte-2.91.sh的PROMPT_COMMAND,以相似的方式设置标题,并且默认设置当前工作目录。
我不知道任何方法可以在PROMPT_COMMAND或其他任何地方(更不用说过滤掉诸如颜色变化之类的转义序列)中引用PS1的解析值(即替换用户名等之后的值)。如果你希望在提示符和窗口标题中看到相同的字符串,我认为你需要为PS1PROMPT_COMMAND分别复制构造该字符串。

使用的转义序列是\[\e]2;NEWTITLE\a\],其中\[\e]\a是转义和响铃字符。使用Bash转义序列,改变提示符中的标题如下: export PS1='\[\e]2;new title\a\]prompt > ' doc ref 因此,一个多颜色截断的Bash提示符的示例,同时还具有自定义终端标题,如下: export PS1='\[\e]2;$PWD\a\]\e[93m$USER\e[97m@\e[90m$HOSTNAME \e[93m$ \e[0m' 在这个示例中,终端的标题将始终反映当前的工作目录($PWD),而不管您所在的目录如何,终端的提示符将始终如下所示:user@hostname $
您可以将$PWD替换为CUSTOM TITLE,以使终端标题始终反映CUSTOM TITLE

更新
在不使用\[\]包裹非打印字符时要小心。没有它们也可以工作,我已经这样做了好几年了。然而,今天我发现在某些设置中,这可能会在终端中引起一些问题。下面是一个更清晰的版本,使用变量并包裹颜色代码:

T_YELLOW='\[\e[93m\]'
T_WHITE='\[\e[97m\]'
T_GRAY='\[\e[90m\]'
T_DEFAULT='\[\e[0m\]'
T_TITLE='\[\e]2;$PWD\a\]'
export PS1="${T_TITLE}${T_YELLOW}$USER${T_WHITE}@${T_GRAY}$HOSTNAME${T_YELLOW} $ ${T_DEFAULT}"

这对你来说是有效的。
打开~/.bashrc。找到包含以下内容的行:
PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"

把这一行注释掉,在它前面加上一个#字符。
# PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"

现在添加这行(您可能希望将其放在注释掉的行之后):
PROMPT_COMMAND='echo -ne "\033]0;Custom Name\007"'

Custom Name替换为您想要更改终端标题的内容。
希望对您有所帮助。

不行!这根本不起作用。我在问题中提到的是同样的命令。我相信你没有正确理解我的问题。执行这个命令会重置我的bash提示符,而我不想要这样。 - Vinay Tiwary
如果我没记错的话,你说可以通过运行PROMPT_COMMAND='echo -ne "\033]0;Custom Name\007"'来更改标题。如果是这样的话,如果你仔细阅读我的回答,你会发现我要求你将这行代码添加到你的~/.bashrc文件中。希望你不介意尝试一下。 - Sinscary
不冒犯!但在发布问题之前,我已经尝试了这个命令。 - Vinay Tiwary
老兄,当你运行PROMPT_COMMAND='echo -ne "\033]0;自定义标题\007"'时,它是否改变了你的标题。 - Sinscary
是的,兄弟,它会像我在问题中所说的那样更改标题,但然后它会恢复原始的bash提示符。 - Vinay Tiwary
现在,你尝试过在你的~/.bashrc文件内将这行注释掉吗:PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1",然后在其下方添加这行代码:PROMPT_COMMAND='echo -ne "\033]0;自定义标题\007"'。如果你尝试过但没成功,请将此问题中提及。 - Sinscary