我有一个问题,如果我在 bash 中输入很长的命令,终端将无法正确呈现我输入的内容。我希望如果我有如下命令:
username@someserver ~/somepath $ ssh -i /path/to/private/key
[email protected]
该命令应呈现为两行。相反,它通常会环绕并开始在我的提示符顶部写入,有点像这样:
[email protected] -i /path/to/private/key
如果我决定返回并更改某些参数,则无法确定光标将显示在哪里,有时在提示的中间,但通常在线路上多于我正在打字的地方。
当我Up执行上一个命令时,会发生额外的乐趣。我已经在 gnome-terminal 和 terminator 以及 i3 和 Cinnamon 上尝试过这个。有人建议这是我的提示,所以这里是:
\[\033[01;32m\]\u:\[\033[01;34m\] \W\033[01;34m \$\[\033[00m\]
Ctrll、reset
、 以及clear
都按照他们所说的去做,但是当我重新输入命令时,还是Up会发生同样的事情。
我查了一下,checkwinsize
在 bash 中启用了。这种情况发生在 80x24 和其他窗口尺寸上。
这只是我学会忍受的事情吗?有什么我应该知道的魔法吗?我已经决定只使用非常短的提示,但这并不能解决问题。
答案1
不可打印的序列应该是包含在\[
和 中\]
。看着你的PS1它之后有一个未封闭的序列\W
。但是,第二个条目是多余的,并且它重复了前一个语句“1;34”。
\[\033[01;32m\]\u:\[\033[01;34m\] \W\033[01;34m \$\[\033[00m\]
|_____________| |_|
| |
+--- Let this apply to this as well.
因此,这应该具有预期的颜色:
\[\033[1;32m\]\u:\[\033[1;34m\] \W \$\[\033[0m\]
|_____|
|
+---- Bold blue.
保持“原来的”这也应该有效:
\[\033[1;32m\]\u:\[\033[1;34m\] \W\[\033[1;34m\] \$\[\033[0m\]
|_| |_|
| |
+-----------+-- Enclose in \[ \]
编辑:
出现这种行为的原因是因为bash
认为提示比实际要长。举一个简单的例子,如果使用:
PS1="\033[0;34m$"
1 2345678
提示符被认为是 8 个字符而不是 1 个字符。因此,如果终端窗口有 20 列,则在输入 12 个字符后,它被认为是 20 并换行。如果尝试执行退格键或 则这一点也很明显Ctrl+u。它停在第 9 列。
但是,除非在最后一列上,否则它也不会开始新行,因此第一行被覆盖。
如果继续输入,该行应在 32 个字符后换行到下一行。
答案2
这主要与终端假定的窗口大小与您的实际窗口大小不同有关。如果你使用的是bash,你可以尝试这个。
$ shopt checkwinsize
如果你没有得到
checkwinsize on
然后激活它
$ shopt -s checkwinsize
然后尝试运行另一个命令(例如ls
)或调整窗口大小一次,以上每次都对我有用。
特别是对于 Redhat 系统,该问题通常是由于错误配置~/.bashrc
而不调用/etc/bashrc
.通常,bash 会加载~/.bashrc
预期调用的/etc/bashrc
,默认情况下包含shopt -s checkwinsize
.
答案3
我曾经在某个地方读过(不知道在哪里了)使用\001
and\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
答案4
COLUMNS
这听起来像是您的&LINES
环境变量设置的问题。当您调整窗口大小时,它们通常由 gnome-terminal 自动设置(我相信),您可以通过发出命令来强制手动设置它们resize
。
例子
如果我将 gnome-terminal 大小调整为 79x17,我的变量将显示如下:
$ echo $COLUMNS; echo $LINES
79
17
我可以像这样强制它:
$ resize
COLUMNS=79;
LINES=17;
export COLUMNS LINES;