터미널 프롬프트가 올바르게 줄 바꿈되지 않음


171

bash에서 매우 긴 명령을 입력하면 터미널이 올바르게 입력 한 내용을 렌더링하지 못하는 문제가 있습니다. 다음과 같은 명령이 있으면 기대할 수 있습니다.

username@someserver ~/somepath $ ssh -i /path/to/private/key
myusername@something.someserver.com

이 명령은 두 줄로 렌더링되어야합니다. 대신 종종 다음과 같이 랩핑되어 내 프롬프트의 맨 위에 쓰기 시작합니다.

myreallylongusername@something.somelongserver.comh -i /path/to/private/key

내가 다시 가서 거기에 커서가 표시됩니다 어떤 이야기가 때때로 프롬프트의 중간에, 없다, 그러나 보통 라인에 약간의 인수를 변경하려는 경우 위의 내가 타이핑 곳.

Up이전 명령을 수행 할 때 추가 재미가 발생합니다 . 나는 그놈 터미널과 터미네이터 그리고 i3과 시나몬에서 이것을 시도했다. 누군가가 내 프롬프트라고 제안 했으므로 여기 있습니다.

\[\033[01;32m\]\u:\[\033[01;34m\] \W\033[01;34m \$\[\033[00m\]

Ctrll,, resetclear모두가 말하는 것을 수행하지만, 명령을 다시 입력하거나 Up같은 일이 발생합니다.

확인하고 checkwinsizebash에서 활성화되었습니다. 이것은 80x24 및 기타 창 크기에서 발생합니다.

이것이 내가 함께 배우는 것입니까? 내가 알아야 할 마술이 있습니까? 정말 짧은 프롬프트를 사용하기로 결정했지만 문제가 해결되지 않습니다.


1
따라서 명령을 사용하면 문제가 env -i bash --norc해결됩니다. $ COLUMNS와 $ LINES가 일치합니다. 내 .bashrc에 재미있는 것이 있다는 것을 의미합니까?
Muricula

그래서 나는 .bashrc를 주석 처리하고 문제가되는 부분, 특히 관련된 채색 구문으로 프롬프트를 분리했습니다. 위의 PS1에 어떤 문제가 있습니까?
Muricula

1
\[\033[01;32m\]\u: \[\033[01;34m\]\W \[\033[01;34m\] \$ \[\033[0m\]동작의 기묘함을 피하는 것 같지만 원래 프롬프트를 완전히 존중하는지 모릅니다.

1
serverfault에 대한이 답변에 따라 다음을 사용하십시오tput smam
Samveen

답변:


189

인쇄 할 수없는 순서는 묶어야\[\] 합니다. 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

프롬프트는 1이 아니라 8자인 것으로 간주됩니다. 따라서 터미널 창이 20 열인 경우 12자를 입력 한 후 20 자이며 줄 바꿈됩니다. 백 스페이스 또는를 시도하는 경우에도 마찬가지 Ctrl+u입니다. 9 열에서 멈 춥니 다.

그러나 마지막 열에 있지 않으면 새 줄을 시작하지 않으므로 첫 번째 줄을 덮어 씁니다.

한 줄을 계속 입력하면 32 자 다음 줄로 줄 바꿈됩니다.


원래 순서대로 정확하게 라인이 반복되는 원인에 대해 설명하는 사람이 있다면 알고 싶습니다. 또한 시각적으로 표시 한 방법에 대해서도 +1입니다.

1
@ illuminÉ : 소스를 보지 않았지만 관찰 결과에 대한 메모가 포함 된 업데이트가 추가되었습니다.
Runium

문제가 생길 경우를 대비하여이 웹 사이트를 사용하여 새로운 웹 사이트를 만들 수 있습니다 -bashrcgenerator.com
divinedragon

이것은 놀라운 일입니다. @Runium에게 감사합니다. 이것을 어떻게 알았습니까? 이것에 대한 문서를 찾고 싶습니다.
nycynik

2
@nycynik : 관찰. 이것에 대한 문서에 가장 가까운 것 같아요 소스 코드입니다 ...
Runium

83

터미널에서 가정 한 창의 크기가 실제 창의 크기와 같지 않은 것이 대부분입니다. bash를 사용하는 경우 시도해 볼 수 있습니다.

$ shopt checkwinsize

당신이 얻지 못하면

checkwinsize    on

그런 다음

$ shopt -s checkwinsize

그런 다음 다른 명령 ( ls)을 실행 하거나 창 크기를 한 번 조정하면 위의 내용이 항상 작동합니다.

특히 Redhat 시스템의 경우이 문제는 종종 ~/.bashrc호출하지 않도록 잘못 구성 하여 발생합니다 /etc/bashrc. 일반적으로 bash ~/.bashrc는을 호출 할 것으로 예상 /etc/bashrc되며 기본적으로을 포함 shopt -s checkwinsize합니다.


OS X에서도 같은 문제가 있었지만, 터미널을 시작하기 위해 "로그인"을 호출하면 / etc / bashrc를 읽는 방식으로 bash가 시작되지만 bash를 바로 호출하면 ~ / .bashrc는 그렇지 않습니다. 이상한 포장 효과를 얻을 수 있도록 기본적으로 소스를 제공합니다. 감사!
rogerdpack

이것은 나를 위해 일했다. 이 특정 서버에서 색상이 켜져 있지 않고 올바른 호출 /etc/bashrc, 다른 모든 것이 좋았습니다 ... 이것이 포장 문제의 원인이라는 것을 알았습니다.
dhaupin


좋은 해결책처럼 보입니다. 그러나 그것은 내 ssh 세션에서 작동하지 않습니다. 이유가 확실하지 않습니다. shopt -s checkwinsizessh 세션에서 명령 을 실행했습니다 . 그러나 포장은 지속됩니다.
Qiang Xu

이것은 정확히 내 문제였습니다. 사용자 .bashrc는 / etc / bashrc를 호출하지 않아서 엉망이되었습니다.
Sobrique

9

다른 답변에서 언급했듯이 인쇄 \e[0;30m할 수 없는 시퀀스와 같이 감싸 야합니다 \[...\].

또한 (그리고 아직 언급하지 않은) 다중 회선 프롬프트가있는 경우 외부\r\n있어야 하는 것 같습니다 . 마침내 그것을 알아 내기 위해 시행 착오가 필요했습니다.\[...\]


8

나는 한 번 선가 (여기서 더 이상 모르는)를 사용하여 그 \001\002대신 \[\]이 문제를 해결할 수 있습니다. 그것은 나를 위해했다.

그건 그렇고, 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

2
내 PS1은 OP의 문제를 일으키는 printf 이스케이프 시퀀스 명령을 호출합니다. 이 솔루션만이 문제를 해결합니다.
RickMeasham

6

COLUMNS& LINES환경 변수 설정에 문제가있는 것 같습니다 . 창 크기를 조정할 때 일반적으로 gnome-terminal에 의해 자동으로 설정됩니다 (믿습니다) 명령을 실행하여 수동으로 창을 설정할 수 있습니다 resize.

그놈 터미널의 크기를 79x17로 조정하면 변수가 다음과 같이 나타납니다.

$ echo $COLUMNS; echo $LINES
79
17

나는 그렇게 강요 할 수 있습니다 :

$ resize
COLUMNS=79;
LINES=17;
export COLUMNS LINES;

1
흥미롭지 만 도움이되지 않습니다.
Muricula

1
이 문제는 "screen"명령을 실행 한 후에 줄 바꿈이 올바르게되지 않는 문제를 해결했습니다. 감사!!
nukeguy

5

줄 바꿈을 방지하기 위해 다음을 사용하여 열 수를 늘릴 수도 있습니다.

stty columns 120

1
아주 좋은 생각은 아니지만, 그것은 잔인하게 vim을 엉망으로
만들었

3

또한 넓은 유니 코드 기호 (예 : https://stackoverflow.com/a/34812608/1657819 ) 를 사용하면 동일한 문제가 발생할 수 있습니다 . 여기에 문제가합니다 (마음을 일으키는 조각입니다 $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

Bash는 길이를 정확하게 계산할 수 없으므로 가장 넓은 방법은 넓은 기호의 세 부분 중 2 개를 이스케이프 처리하는 것입니다.

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

맞는 말이다. 내가 추측하는 것은 bash가 문자를 계산한다는 것입니다. X는 하나의 문자를 사용하지만 3으로 작성되므로 계산을 수정하려면 2를 묶어야합니다. @ blauhirn answer는 \001및 로 함수를 수행하는 방법도 설명합니다 \002.
akostadinov

참고로, 이것은 다음 형식으로 멀티 바이트 유니 코드 문자를 출력하는 방법을 알아내는 방법입니다. stackoverflow.com/a/602924/520567
akostadinov
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.