bash 提示 shell 在终端和 tty 控制台中显示不同
bash prompt shell displayed differently in terminal and tty console
这是我的一部分 ~/.bashrc:
prompt(){
local EXIT="$?" # return code
PS1=""
local red="\[3[0;31m\]" # text colour
local purple="\[3[0;35m\]" # text colour
local normal="\[3[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 侏儒 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
您在 PS1
中有 \[\e]0; \u@\h: \w\a\]
和 \u@\h:\w\$
。
问题是为什么您的终端没有显示第一组但您的控制台显示了。
我相信,答案是您将第一组包含在 \[...\]
块中,这表明它是非打印的并且不占用 space(这就是为什么您需要在 \[...\]
中包含颜色代码,以避免在代码不创建可见字符时提示比终端预期的更短。
这导致 gnome-terminal 丢弃 \[...\]
块的 output/contents 中的所有内容(甚至可见字符)。
据推测,控制台只是打印可见字符(并忽略非打印字符)。 (不知道这会不会导致提示大小计算错误。)
这里的解决方案是删除第一组(看似无意的)转义。
这是我的一部分 ~/.bashrc:
prompt(){
local EXIT="$?" # return code
PS1=""
local red="\[3[0;31m\]" # text colour
local purple="\[3[0;35m\]" # text colour
local normal="\[3[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 侏儒 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
您在 PS1
中有 \[\e]0; \u@\h: \w\a\]
和 \u@\h:\w\$
。
问题是为什么您的终端没有显示第一组但您的控制台显示了。
我相信,答案是您将第一组包含在 \[...\]
块中,这表明它是非打印的并且不占用 space(这就是为什么您需要在 \[...\]
中包含颜色代码,以避免在代码不创建可见字符时提示比终端预期的更短。
这导致 gnome-terminal 丢弃 \[...\]
块的 output/contents 中的所有内容(甚至可见字符)。
据推测,控制台只是打印可见字符(并忽略非打印字符)。 (不知道这会不会导致提示大小计算错误。)
这里的解决方案是删除第一组(看似无意的)转义。