终端和tty控制台中显示的bash提示符外壳不同。

3

This is a portion of my ~/.bashrc:

prompt(){
    local EXIT="$?"  # return code
    PS1=""
    local red="\[\033[0;31m\]"  # text colour
    local purple="\[\033[0;35m\]"  # text colour
    local normal="\[\033[0m\]"  # text colour

    if [ $EXIT == 0 ]; then  # $EXIT colour based upon its value
        local return="${normal}${?}"
    else
        local return="${red}${?}${normal}"
    fi

    PS1+="${normal}[${purple}\\D{%-l:%M%P}${normal}]${return} \\[\\e]0; \
    \\u@\\h: \\w\\a\\]${debian_chroot:+($debian_chroot)}\\u@\\h:\\w\\$ "
}

export PROMPT_COMMAND=prompt

这是我在gnome-terminal中的提示符Shell(正确显示):

[5:01pm]0 user@host:~$

但是当我切换到tty控制台后,登录后显示如下内容:
[5:05pm]0 ;user@host: ~user@host:~$

这种情况发生在普通用户和root用户都在同一台笔记本电脑上,使用相同的操作系统。颜色始终显示正确,唯一的问题是提示符的显示方式。


软件版本:

  • GNU bash,版本4.3.11(1)-release (i686-pc-linux-gnu),
  • Ubuntu Gnome 14.04。

有关PS1值的一些解释:

[5:01pm]   # current time
0          # return/exit code of the last command (0 can be any number;
           # if return code has a non-zero value, it turns red)

PS- 目前在tty控制台中,我需要执行source ~/.bashrc才能使用所有设置。(1) tty控制台自己的.bashrc文件位于何处?(2)或者如何设置它以使用~/.bashrc


解决提示行为不同的问题

正如接受的答案所建议的那样,在PS1变量中,有一部分应该被省略,因此我只改变了函数的最后一行

PS1+="${normal}[${purple}\\D{%-l:%M%P}${normal}]${return} \
${debian_chroot:+($debian_chroot)}\\u@\\h:\\w\\$ "

Post Scriptum (PS)的解决方案

tty控制台使用~/.bashrc_profile而不是~/.bashrc,因为(如下面的@chepner评论所说),后者由GUI终端仿真器调用(因为它通常启动非登录交互式shell)。tty控制台是一个交互式shell。

我的解决方案是将以下内容添加到~/.bash_profile中:

. ~/.bashrc

1
.bashrc 是针对登录用户而非终端类型的特定文件。 - chepner
我也曾这么想,但即使我使用相同的凭据登录到GUI模式(因此登录到gnome-terminal)和tty控制台,但在tty控制台中,如果我想要使用~/.bashrc的设置,则首先需要输入source ~/.bashrc命令。 - tukusejssirs
2
当您登录控制台时,login程序会启动一个登录shell,该shell源自.bash_profile而不是.bashrc。GUI终端仿真器通常会启动一个非登录交互式shell,该shell源自.bashrc而不是.bash_profile,因为您的GUI可能是从登录shell启动的。将source ~/.bashrc包含在您的.bash_profile中是一种相当普遍的做法,以便为所有交互式shell提供.bashrc,无论它们是否是登录shell。 - chepner
1个回答

2
你的终端中出现了\\[\\e]0; \\u@\\h: \\w\\a\\]\\u@\\h:\\w\\$,但问题在于为什么你的终端没有显示第一组而控制台却有。
我认为答案是你将第一组字符包含在\[...\]块中,这表示它是不可打印的并且不占用空间(这就是为什么你需要将颜色代码包含在\[...\]中,以避免提示符比终端预期的短,当代码不创建可见字符时)。
这导致gnome-terminal放弃来自\[...\]块的所有内容(即使是可见字符)。
控制台可能只是简单地打印可见字符(并忽略不可打印字符)。 (我想知道这是否会导致提示符大小计算错误。)
解决方案是删除第一组(看起来无意的)转义字符。

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