bash命令行无法正确读取命令

时间:2014-03-03 03:28:32

标签: linux bash terminal console tty

我有关于bash终端的问题,它让我发疯,我不知道为什么 这是关于终端,让我描述如下:
起初提示符如下:

[12:00]ruan:~>  

但是当我连续输入字符时(例如,假设我输入了很多A),发生了奇怪的事情:

AAA:00]ruan:~ > AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA  

正如您所看到的,我输入的字符从行的开头开始,这使我的命令不可读。我不知道怎么会发生这种情况。它与stty,inputrc还是别的什么有关? / BR
ruan

我的tty配置就像:

:)[11:38]ruan:~ > stty -a
speed 38400 baud; 25 rows; 80 columns;
lflags: icanon isig iexten echo echoe echok echoke -echonl echoctl
    -echoprt -altwerase -noflsh -tostop -flusho pendin -nokerninfo
    -extproc
iflags: -istrip icrnl -inlcr -igncr ixon -ixoff ixany imaxbel iutf8
    -ignbrk brkint -inpck -ignpar -parmrk
oflags: opost onlcr -oxtabs -onocr -onlret
cflags: cread cs8 -parenb -parodd hupcl -clocal -cstopb -crtscts -dsrflow
    -dtrflow -mdmbuf
cchars: discard = ^O; dsusp = ^Y; eof = ^D; eol = <undef>;
    eol2 = <undef>; erase = ^?; intr = ^C; kill = ^U; lnext = ^V;
    min = 1; quit = ^\; reprint = ^R; start = ^Q; status = ^T;
    stop = ^S; susp = ^Z; time = 0; werase = ^W;

我设置了PS1,如:

NORMAL="\033[0m"
RED="\033[0;31m"
RED_BOLD="\033[1;31m"
GREEN="\033[0;32m"
GREEN_BOLD="\033[1;32m"
YELLOW="\033[0;33m"
YELLOW_BOLD="\033[1;33m"
BLUE="\033[0;34m"
BLUE_BOLD="\033[1;34m"
MAGENTA="\033[0;35m"
MAGENTA_BOLD="\033[1;35m"
CYAN="\033[0;36m"
CYAN_BOLD="\033[1;36m"

function smile_or_frown() {
    [[ $? = 0 ]] && echo -e "${CYAN_BOLD}:)" || echo -e "${MAGENTA_BOLD}:("
}
export PS1="\$(smile_or_frown)$BLUE_BOLD[\A]$GREEN_BOLD\u:$RED_BOLD\w$YELLOW_BOLD\$(parse_git_branch)$NORMAL > "

2 个答案:

答案 0 :(得分:1)

您必须在\[ .. \]中包含所有ANSI转义序列,以便向Bash发出信号,告知这些转义不占用终端上的空间。

它们必须是格式字符串本身,并且不能成为在提示时扩展的数据的一部分(但可以在分配时扩展数据)。

例如:

export PS1="\[$BLUE_BOLD\][\A]\[$GREEN_BOLD\]\u:\[$RED_BOLD\]\w\[$YELLOW_BOLD\]\$(parse_git_branch)\[$NORMAL\] > "

要使这个工作适用于smile_or_frown,你必须将它重构为两个函数,一个用于颜色,一个用于文本,这样你就可以"\[\$(smile_color)\]\$(smile_type)"

答案 1 :(得分:0)

运行此命令以检查当前终端列(宽度)

tput cols

并使用它将其设置为80 cols:

stty cols 80

编辑:根据您编辑过的问题,您的复杂PS1会出现这种情况。您可以将PS1重置为简单:

PS1='$>'

也解决了这个问题。