히스토리를 스크롤 할 때이 bash 프롬프트가 때때로 이전 명령의 일부를 유지하는 이유는 무엇입니까?


29

몇 군데에서 도난 당했음을 알 수있는 bash 프롬프트는 위 / 아래 화살표로 bash 기록을 스크롤 할 때 이전 명령의 일부를 길이에 추가하는 경우가 있습니다.

예를 들어, 이전 명령이 다음과 같은 경우

ls
cd /home/caleb
vim .bashrc

프롬프트에 있고 두 번 위로 스크롤하면 다음과 같이 보일 수 있습니다.

vim .bcd / home / caleb

마지막 명령에서 처음 다섯 문자가 남은 곳.

왜 이런 일이 발생하는지, 어떻게 중지시킬 수 있는지 알고 있습니까?

내 프롬프트는이 코드로 설정됩니다 (여기를 포함하기 위해 오랫동안 갈 것입니다) : https://gist.github.com/1679352


1
전체 vcs 크랩이없는 값으로 PS1을 설정하고 어떻게되는지 확인하십시오. 내 추측이다.
Daniel Beck

프롬프트에서 이미 범인을 찾았습니까? 같은 문제가 있습니다.
acme

bash는 색상을 잃어 버리고 색상 이스케이프가있는 문자열의 길이를 보이는 문자열의 길이와 분리 할 수 ​​없습니다. 이것이 SiegeX가 얻은 것입니다. ZSH로 전환하고 다른 프롬프트를 사용했습니다. ZSH는 같은 문제가 없습니다.
Caleb Thompson

1
이전의 두 대답 모두 내 문제를 해결하지 못했으며 왜 이런 일이 발생했는지 설명하지 않았습니다. 이 시점까지 검색 한 사람이 있으면 Custom Bash 프롬프트가 자체를 덮어 쓰고 있는지 확인하십시오 .
D3Hunter

답변:


6

어딘가에 당신의 프롬프트는 fubar입니다. 일반적으로 발생하는 일은 쉘이 인쇄 할 수없는 용어 코드를 출력하고 공간을 차지할 것으로 예상한다는 것입니다. 내가 줄 수있는 최선의 조언은이 문제가 발생하는 코드를 분리하기 위해이 동작이 중지 될 때까지 프롬프트에 체계적으로 추가하거나 제거하는 것입니다.


36

색상 코드는 대괄호로 묶어야합니다. 괄호는 bash에 동봉 된 텍스트를 인쇄해서는 안된다고 알려줍니다.

@Phreditor의 예를 바탕으로 개행 후 수행 된 모든 형식은 원래 문제가 있음을 보여줍니다.

export PS1="\n\n\[\033[01;33m[\w]\033[00m\n\033[0;90m\$ "

[] 형식 코드를 래핑하면 성가신 동작이 발생하지 않습니다.

export PS1="\n\[\[\033[01;33m\][\w]\[\033[00m\]\n\[\033[0;90m\]\$ "

설명서 : http://tldp.org/HOWTO/Bash-Prompt-HOWTO/nonprintingchars.html

PS1 형식화로 인해 값이 너무 길고 읽기 어렵 기 때문에 형식 코드를 변수에 넣습니다.

BYELLOW='\[\033[01;33m\]'
IBLACK='\[\033[0;90m\]'
PS_CLEAR='\[\033[0m\]'
export PS1="\n${BYELLOW}[\w]${PS_CLEAR}\n${IBLACK}\$ "

3
이것이 정답입니다. 문제를 해결했습니다.
Atcold

1
백 슬래시와 대괄호의 혼란에서 이스케이프 시퀀스 뒤에 나오는 대괄호는 이스케이프 \033되어서는 안된다는 점에 유의해야합니다 (; 참고하지 않았기 때문에;)) . 랩핑 대괄호 만 이스케이프 처리해야합니다.
Benjam

첫 번째 Google 검색 결과를 사용하여 모든 특수 문자를 처리하는 데 혼란을 줄 수있는 방법은 내가 원하는 방식으로 작업 프롬프트를 생성하는 데 도움이되었습니다. ezprompt.net
Mallox

나는 YEARS에 대한 프롬프트 색상을 사용자 정의하고 싶었지만 항상이 문제가 발생한 적이 없었습니다! 나는 왜 막 멈추고 모든 것을 흰색으로 유지했는지 알 수 없었습니다. 새 컴퓨터를 설치하고 마침내 Google에 한 번 문제를 제기하기 시작했습니다. 정말 기뻤습니다! 이 훌륭한 교훈에 감사드립니다.
TylerH4

8

나는 같은 문제가 있었고 색 정의와 관련이있었습니다.

필자의 경우 여러 줄 프롬프트가 있습니다 (프롬프트가 표시하는 경로 길이에 관계없이 현재 명령에 대한 대부분의 공간을 제공함).

나쁜 버전 :

export PS1="\n\n\[\033[01;33m[\w]\n\033[00m\$ "

좋은 버전 :

export PS1="\n\n\[\033[01;33m[\w]\033[00m\n\$ "

\033[00m색상을 종료합니다. 줄 바꿈 ( \n) 뒤에 오는 경우 터미널에서 올바른 다시 그리기를 방지하여 이전 명령을 배경색으로 덮어 씁니다. 새 줄 뒤로 이동하면 문제가 해결되었습니다.

(Mac OS 10.8에서 터미널 사용)


이것은 현재 문제를 지적했지만 현재 받아 들여진 대답은 너무 일반적이었습니다.
Brian

이것은보다 정확한 답변이며 승자가되어야합니다 (그리고 내 문제의 해결책이었습니다).
craveytrain

\n너무 나를 위해 범인이었다. 감사!
mhulse

3

실제로 이것은 누락 된 '비 인쇄 문자'구분 기호와 관련이 있다고 생각합니다. 정확히 같은 문제가 있었지만 개행 (\ n) 이전으로 이동해도 문제가 해결되지 않았습니다. 대신 '\ ['및 '\]'로 인쇄하지 않는 모든 문자 (여기서는 색칠 명령)를 올바르게 둘러싸 았습니다.

좋지 않습니다 (작동하지만 위에서 설명한 기록 매쉬 문제가 있음).

PS1="\e[32m\u\e[35m@\e[32m\h \e[33m\w\e[36m\n\$\e[0m"

양호 ( '\ ['및 '\]'가있는 모든 색상 명령 주위에-으깬 명령 기록이 표시되지 않음) :

PS1="\[\e[32m\]\u\[\e[35m\]@\[\e[32m\]\h \[\e[33m\]\w\[\e[36m\]\n\$\[\e[0m\]"

i.e. "\e[...m" --becomes--> "\[\e[...m\]"

그리고 시스템에 로그인 할 때 이것을 자동으로 보내기 위해 SecureCRT와 같은 것에 넣으면 자동 로그인 시스템이 첫 번째 백 슬래시 자체를 소비하여 보낼 문자를 결정하면 모든 것을 두 번 이스케이프해야합니다 (두 번 백 슬래시 배치). :

PS1="\\[\\e[32m\\]\\u\\[\\e[35m\\]@\\[\\e[32m\\]\\h \\[\\e[33m\\]\\w\\[\\e[36m\\]\\n\\$\\[\\e[0m\\]"

i.e. "\..." --becomes--> "\\..."

(이것은 SecureCRT의 경우에는 사실이며 PuTTY 또는 TeraTerm과 같은 다른 부분의 경우도 마찬가지입니다. 테스트는 사용자가 필요로합니다.)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.