终端提示未正确换行

Mur*_*ula 214 bash prompt terminal

我有一个问题,如果我在 bash 中输入很长的命令,终端将无法正确显示我输入的内容。我希望如果我有如下命令:

username@someserver ~/somepath $ ssh -i /path/to/private/key
myusername@something.someserver.com
Run Code Online (Sandbox Code Playgroud)

该命令应呈现在两行上。相反,它通常会环绕并开始写在我提示的顶部,有点像这样:

myreallylongusername@something.somelongserver.comh -i /path/to/private/key
Run Code Online (Sandbox Code Playgroud)

如果我决定返回并更改某些参数,则不知道光标会出现在哪里,有时在提示的中间,但通常在我正在输入的行上方

当我Up执行上一个命令时会发生额外的乐趣。我已经在 gnome-terminal 和 terminator 以及 i3 和 Cinnamon 上尝试过这个。有人建议这是我的提示,所以这里是:

\[\033[01;32m\]\u:\[\033[01;34m\] \W\033[01;34m \$\[\033[00m\]
Run Code Online (Sandbox Code Playgroud)

Ctrll, reset, 并且clear都按照他们说的做,但是当我重新输入命令或Up发生相同的事情时。

我检查并checkwinsize在 bash 中启用。这发生在 80x24 和其他窗口大小上。

这只是我学会忍受的东西吗?有什么我应该知道的魔法吗?我已经决定只使用一个非常短的提示,但这并不能解决问题。

Run*_*ium 247

不可打印的序列应包含在\[和 中\]。看看你的PS1,它在\W. 但是,第二个条目是多余的,因为它重复了前面的语句"1;34"

\[\033[01;32m\]\u:\[\033[01;34m\] \W\033[01;34m \$\[\033[00m\]
                  |_____________|               |_|
                         |                       |
                         +--- Let this apply to this as well.
Run Code Online (Sandbox Code Playgroud)

因此,这应该有预期的着色:

\[\033[1;32m\]\u:\[\033[1;34m\] \W \$\[\033[0m\]
                               |_____|
                                  |
                                  +---- Bold blue.
Run Code Online (Sandbox Code Playgroud)

保持“原始”这也应该有效:

\[\033[1;32m\]\u:\[\033[1;34m\] \W\[\033[1;34m\] \$\[\033[0m\]
                                  |_|         |_|
                                   |           |
                                   +-----------+-- Enclose in \[ \]
Run Code Online (Sandbox Code Playgroud)

编辑:

行为的原因是因为bash认为提示比实际时间长。作为一个简单的例子,如果使用:

PS1="\033[0;34m$"
       1 2345678
Run Code Online (Sandbox Code Playgroud)

提示被认为是 8 个字符而不是 1。因此,如果终端窗口是 20 列,则在键入 12 个字符后,它被认为是 20 并环绕。如果然后尝试执行退格键或Ctrl+u. 它停在第 9 列。

然而,它也不会开始新行,除非最后一列,结果第一行被覆盖。

如果继续输入该行应在 32 个字符后换行到下一行。

  • 不是所有的英雄穿着斗篷。 (6认同)
  • @nycynik:观察。我想最接近文档的是源代码...... (2认同)

sak*_*trp 98

这主要与终端假设的窗口大小与您的实际窗口大小不同有关。如果你正在使用 bash,你可以试试这个。

$ shopt checkwinsize
Run Code Online (Sandbox Code Playgroud)

如果你没有得到

checkwinsize    on
Run Code Online (Sandbox Code Playgroud)

然后激活它

$ shopt -s checkwinsize
Run Code Online (Sandbox Code Playgroud)

然后尝试运行另一个命令(如ls)或调整窗口大小一次,以上每次都对我有用。

特别是对于 Redhat 系统,该问题通常是由于错误配置~/.bashrc不调用/etc/bashrc. 通常,bash 加载~/.bashrc预期调用的/etc/bashrc,默认情况下包含shopt -s checkwinsize.


phi*_*294 20

我曾经在某处(不知道在哪里)使用\001and\002而不是\[and\]可以解决这个问题。它对我有用。

顺便说一句,定义 PS1 不必看起来很丑。

green="\001$(tput setaf 2)\002"
blue="\001$(tput setaf 4)\002"
dim="\001$(tput dim)\002"
reset="\001$(tput sgr0)\002"

PS1="$dim[\t] " # [hh:mm:ss]
PS1+="$green\u@\h" # user@host
PS1+="$blue\w\$$reset " # workingdir$

export PS1
unset green blue dim reset
Run Code Online (Sandbox Code Playgroud)

  • 我的 PS1 调用 printf 转义序列导致 OP 问题的命令。只有这个解决方案为我解决了这个问题。 (4认同)

Ger*_*den 11

正如其他答案中提到的,不可打印的序列,例如\e[0;30m应该用\[...\].

此外(和我没有看到没有提到)是它似乎\r\n应该是外面\[...\],如果你有一个多行的提示。我花了一些试验和错误才最终弄明白。


slm*_*slm 9

这听起来像是您的COLUMNS&LINES环境变量设置的问题。当您调整窗口大小时,它们通常由 gnome-terminal 自动设置(我相信),您可以通过发出命令来强制手动设置它们resize

例子

如果我将 gnome 终端的大小调整为 79x17,我的变量显示如下:

$ echo $COLUMNS; echo $LINES
79
17
Run Code Online (Sandbox Code Playgroud)

我可以像这样强迫它:

$ resize
COLUMNS=79;
LINES=17;
export COLUMNS LINES;
Run Code Online (Sandbox Code Playgroud)


小智 7

为了防止换行,您还可以使用例如增加列数

stty columns 120
Run Code Online (Sandbox Code Playgroud)


The*_*her 5

使用宽 unicode 符号(例如来自/sf/answers/2436882591/)也可能导致相同的问题。这是导致问题的代码段(注意$Green$Red正确转义颜色字符串):

FancyX='\342\234\227'
Checkmark='\342\234\223'


# Add a bright white exit status for the last command
PS1="$White\$? "
# If it was successful, print a green check mark. Otherwise, print
# a red X.
if [[ $Last_Command == 0 ]]; then
    PS1+="$Green$Checkmark "
else
    PS1+="$Red$FancyX "
fi
Run Code Online (Sandbox Code Playgroud)

Bash 无法正确计算长度,因此最简单的方法可能是转义这些宽符号的三个部分中的两个。

FancyX='\[\342\234\]\227'
Checkmark='\[\342\234\]\223'
Run Code Online (Sandbox Code Playgroud)