Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
bash提示符shell在终端和tty控制台中的显示方式不同_Bash_Terminal_Console_Tty_Ps1 - Fatal编程技术网

bash提示符shell在终端和tty控制台中的显示方式不同

bash提示符shell在终端和tty控制台中的显示方式不同,bash,terminal,console,tty,ps1,Bash,Terminal,Console,Tty,Ps1,这是我的~/.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 # $E

这是我的~/.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终端中的提示shell(正确显示):

但当我切换到tty控制台时,在我登录后,会显示:

[5:01pm]0 user@host:~$
[5:05pm]0 ;user@host: ~user@host:~$
这种情况发生在普通用户身上,也发生在同一操作系统上同一笔记本上的root用户身上。 颜色始终正确显示,唯一的问题是提示的显示方式


软件版本:

  • GNUBash,版本4.3.11(1)-发行版(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\\$ "

后脚本解决方案(PS)

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

我的解决方案是将以下内容添加到
~/.bash\u profile

. ~/.bashrc

您有
\\[\\e]0\\u@\\h:\\w\\a\\]
中的

问题是为什么您的终端没有显示第一组,而您的控制台显示第一组

我认为,答案是,第一个集合包含在
\[…\]
块中,表示它不打印,不占用空间(这就是为什么需要在
\[…\]
中包含颜色代码,以避免在代码不创建可见字符时,提示比终端预期的短

这导致gnome终端丢弃
\[…\]
块的输出/内容中的所有内容(甚至可见字符)

控制台可能只是打印可见字符(而忽略非打印字符)。(我想知道这是否会导致提示大小计算错误。)


这里的解决方案是删除第一组转义(似乎是无意的)。

.bashrc
特定于登录的用户,而不是终端类型。所以我也这么想,但即使我使用相同的凭据登录到GUI mod(从而登录到gnome终端)对于tty控制台,仍然在tty控制台中,如果我想使用
~/.bashrc
设置,首先我需要输入
source~/.bashrc
命令。当您登录到控制台时,
login
程序正在启动一个登录shell,它来自
.bash\u profile
,而不是
.bashrc
。GUI终端仿真器通常是tarts是一个非登录的交互式shell,它源于
.bashrc
,而不是
.bash\u profile
,因为您的GUI可能是从登录shell启动的。从
.bashrc
中包含
源代码~/.bashrc
,这是一种相当常见的做法,因此
.bashrc
源于所有交互式shell,无论是r不是,它们是登录shell。