Mur*_*ula 214 bash prompt terminal
我有一个问题,如果我在 bash 中输入很长的命令,终端将无法正确显示我输入的内容。我希望如果我有如下命令:
username@someserver ~/somepath $ ssh -i /path/to/private/key
myusername@something.someserver.comRun Code Online (Sandbox Code Playgroud)
该命令应呈现在两行上。相反,它通常会环绕并开始写在我提示的顶部,有点像这样:
myreallylongusername@something.somelongserver.comh -i /path/to/private/keyRun 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 个字符后换行到下一行。
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)
Ger*_*den 11
正如其他答案中提到的,不可打印的序列,例如\e[0;30m应该用\[...\].
此外(和我没有看到没有提到)是它似乎\r\n应该是外面的\[...\],如果你有一个多行的提示。我花了一些试验和错误才最终弄明白。
这听起来像是您的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)
使用宽 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)