bash: 긴 줄 표시가 혼란스럽습니다.

bash: 긴 줄 표시가 혼란스럽습니다.

Ubuntu 16.04에서 GNU bash 버전 4.4.0(1)을 사용하고 있습니다.

bash에 긴 줄을 입력하면 디스플레이가 복잡해집니다.

예를 들어, 내가 다음과 같이 ~/test/test/test/test/test/test/test입력한다고 가정 해 보겠습니다 .echo "The quick brown fox jumps over the lazy doggo"여기에 이미지 설명을 입력하세요. 괜찮습니다. 비록 저는 랩어라운드 디스플레이를 선호하고 이중 코드 없이도 할 수 있습니다.

문제는 이제 백스페이스를 세 번 누르고 큰따옴표를 한 번 추가하여 문장을 수정하면 다음과 같이 표시된다는 것입니다. 여기에 이미지 설명을 입력하세요.

마지막으로 o"오류가 표시됩니다. Enter를 눌러 확인하세요. 여기에 이미지 설명을 입력하세요.

dog대신 에 원하는 문장이 인쇄된 것을 볼 수 있습니다 . doggo하지만 무슨 이유에서인지 녹색으로 인쇄되어 있습니다.

이제 터미널 창을 몇 번 확대 및 축소하면 이 모든 것이 더욱 악화됩니다. 그런 다음 터미널의 내용이 무작위로 복사되어 전체 터미널에 연결됩니다. 여기에 이미지 설명을 입력하세요. (길고 검은색 상자는 프롬프트 내용을 무작위로 연결한 것입니다.)

~/.bashrc비록 내가 방금 했을지라도 이 모든 것이 관련 있을 수 있다고 생각 합니다 cp /etc/skel/.bashrc ~/. 어쨌든, 여기 있습니다:

# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

# don't put duplicate lines or lines starting with space in the history.
# See bash(1) for more options
HISTCONTROL=ignoreboth

# append to the history file, don't overwrite it
shopt -s histappend

# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
HISTSIZE=1000
HISTFILESIZE=2000

# check the window size after each command and, if necessary,
# update the values of LINES and COLUMNS.
shopt -s checkwinsize

# If set, the pattern "**" used in a pathname expansion context will
# match all files and zero or more directories and subdirectories.
#shopt -s globstar

# make less more friendly for non-text input files, see lesspipe(1)
[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)"

# set variable identifying the chroot you work in (used in the prompt below)
if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then
    debian_chroot=$(cat /etc/debian_chroot)
fi

# set a fancy prompt (non-color, unless we know we "want" color)
case "$TERM" in
    xterm-color|*-256color) color_prompt=yes;;
esac

# uncomment for a colored prompt, if the terminal has the capability; turned
# off by default to not distract the user: the focus in a terminal window
# should be on the output of commands, not on the prompt
#force_color_prompt=yes

if [ -n "$force_color_prompt" ]; then
    if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
    # We have color support; assume it's compliant with Ecma-48
    # (ISO/IEC-6429). (Lack of such support is extremely rare, and such
    # a case would tend to support setf rather than setaf.)
    color_prompt=yes
    else
    color_prompt=
    fi
fi

if [ "$color_prompt" = yes ]; then
    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
    PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi
unset color_prompt force_color_prompt

# If this is an xterm set the title to user@host:dir
case "$TERM" in
xterm*|rxvt*)
    PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"
    ;;
*)
    ;;
esac

# enable color support of ls and also add handy aliases
if [ -x /usr/bin/dircolors ]; then
    test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
    alias ls='ls --color=auto'
    #alias dir='dir --color=auto'
    #alias vdir='vdir --color=auto'

    alias grep='grep --color=auto'
    alias fgrep='fgrep --color=auto'
    alias egrep='egrep --color=auto'
fi

# colored GCC warnings and errors
#export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01'

# some more ls aliases
alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'

# Add an "alert" alias for long running commands.  Use like so:
#   sleep 10; alert
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'

# Alias definitions.
# You may want to put all your additions into a separate file like
# ~/.bash_aliases, instead of adding them here directly.
# See /usr/share/doc/bash-doc/examples in the bash-doc package.

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi

# enable programmable completion features (you don't need to enable
# this, if it's already enabled in /etc/bash.bashrc and /etc/profile
# sources /etc/bash.bashrc).
if ! shopt -oq posix; then
  if [ -f /usr/share/bash-completion/bash_completion ]; then
    . /usr/share/bash-completion/bash_completion
  elif [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
  fi
fi

~/.bashrc를 삭제하면 다음과 같은 결과가 나타납니다. ( echo "This is a really long sentence, even long than a sentence containing all letters of the alphabet"더 짧은 프롬프트를 보완하기 위해 이 명령을 사용합니다.)

첫째, 모든 것이 괜찮습니다. 여기에 이미지 설명을 입력하세요.

몇 단어를 제거한 후 줄 끝에 남은 내용이 표시됩니다. 여기에 이미지 설명을 입력하세요.

또한 백스페이스 키를 계속 누르면 프롬프트의 일부를 삭제할 수도 있습니다. 여기에 이미지 설명을 입력하세요.

Enter 키를 누르고 명령 끝을 로 수정한 후 [...], ev"크기를 조정할 때 일반적인 혼란이 발생했습니다. 여기에 이미지 설명을 입력하세요.

답변1

귀하의 팁에는 색상(및 기타 인쇄할 수 없는 콘텐츠)이 포함되어 있습니다.

\[\]Bash에서는 프롬프트 길이를 계산할 때 이러한 부분을 로 둘러싸서 bash에게 이 부분을 무시하도록 지시할 수 있습니다 .

전임자:

PS1="\e[33mthis is green\e[0m this is normal"
# should be done as:
PS1="\[\e[33m\]this is green\[\e[0m\] this is normal"

두 번째 주위의 \[각 부분은 \]색상을 변경할 때 디스플레이에 보이는 문자를 추가하지 않으므로 프롬프트에서 문자 위치를 계산할 때 계산되어서는 안 됩니다.

\[PS1을 수정한 경우 눈에 보이는 문자를 넣지 않도록 하세요 \]. 그렇다면 제외하십시오.

shopt -q -s checkwinsize또 다른 사항: 크기 조정 시 터미널 크기가 업데이트되는지 확인 하고 싶을 수도 있습니다 .

그리고 현재 입력된 명령줄의 끝만 표시하는 설정을 사용하고 있는 것 같습니다(ksh가 수행하는 것과 유사합니다... bash를 사용하고 있습니까?). 이를 변경하려면 어떤 옵션이 있는지 살펴보겠습니다. 하지만 아직은 모르겠어요.

편집하다

채팅 중에 우리는 다음 사항에 대해서도 논의했습니다.

set -o emacs  #he was in vi mode
set -o posix  #he was in posix=no mode

하지만 결국 효과가 있는 것 같았던 것은 ~/.inputrc를 제거하는 것이었습니다. (그가 그렇게 했습니다. 잘못된 내용이 포함될 수 있지만 그 내용이 무엇인지 모르겠고 삭제하라는 요청도 받지 않았습니다 ^^ 그냥 이름을 바꾸세요. ) (또는 내용 수정)이 도움이 될 것입니다...)

답변2

@OlivierDulac의 도움으로 ~/.bashrc및 를 변경하여 이 문제를 해결했습니다 ~/.inputrc.

~/.bashrc현재 사용 중인 경우 :

PS1='\e[01;32m\u:\e[01;34m\w\e[0m\$ '

색상을 생성하기 위해 \033을 \e로 바꿨습니다. 원래 PS1에서 이렇게만 해도 고쳐지지 않아서 뭔가 다른 문제가 있는 것 같은데 너무 피곤해서 찾아볼 수가 없네요. 나는 (많은 조언에도 불구하고, PS1을 만들 때 사용한 ezprompt.net에도 불구하고) 인쇄되지 않는 문자를 사용하거나 포함 \[하지 않는다는 사실을 믿습니다. \]사실, 실제로 이것을 사용하면 모든 것이 다시 엉망이 됩니다.

~/.inputrc, 전에도 먹어본 적이 있어요

#These lines make the vi mode visible by switching from a block cursor to a line cursor.
set show-mode-in-prompt on
[...]
set vi-cmd-mode-string \1\e[1 q\2
set vi-ins-mode-string \1\e[5 q\2

\1방금을 (를) 제거했는데 \2이제

set editing-mode vi
[...]
set show-mode-in-prompt on
set vi-cmd-mode-string \e[1 q
set vi-ins-mode-string \e[5 q

다시 말하지만, 이는 제가 다른 곳에서 권장한 것과 반대입니다. 아마도 비교적 새로운 버전의 bash를 사용하고 있기 때문일까요? ( set show-mode-in-prompt onbash4.4 afaik에만 해당)

답변3

단말기 설정(단말기 종류)이 정확합니까? 내 우분투 Linux 호스트에서 내 터미널 유형은 "ansi"입니다. (이 정보는 echo $TERM 명령을 실행하여 얻을 수 있습니다.) 터미널 유형은 사용 중인 화면(콘솔)과 일치해야 합니다. 가끔 터미널 유형이 잘못된 경우 터미널/콘솔이 터미널 이스케이프 코드(예: 커서 제어)를 인식하지 못하여 화면 출력이 왜곡되는 경우가 있습니다. 다른 표준 터미널 유형에는 "vt100" 및 "vt220"이 포함됩니다.

답변4

변화

TERM=xterm-256color

도착하다

TERM=xterm

관련 정보