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

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

여러 곳에서 훔쳐서 함께 엮은 내 bash 프롬프트는 위/아래 화살표로 bash 기록을 스크롤할 때 때때로 이전 명령의 일부를 길이에 추가합니다.

예를 들어, 이전 명령이 다음과 같다면:

ls
cd /home/caleb
vim .bashrc

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

$ vim .bcd /home/caleb

마지막 명령에서 처음 5자가 남은 위치입니다.

왜 이런 일이 발생하는지, 어떻게 막을 수 있는지 아는 사람이 있나요?

내 프롬프트는 다음 코드로 설정됩니다(여기에 포함하려면 너무 길어요).https://gist.github.com/1679352

답변1

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

답변2

색상 코드는 대괄호로 묶어야 합니다. 대괄호는 포함된 텍스트가 인쇄되지 않아야 함을 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

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

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

잘못된 버전:

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에서 터미널 사용)

답변4

나는이 문제를 겪었습니다. 내가 무엇을 감지했나요?

PS1 변수 내부에 색상이 있는 경우(예: "\e[35m" ) 항상 "\[" 및 "\]"(예: "\[\e[35m\]" )로 묶어야 합니다.

이 규칙에 따라 PS1의 모든 색상을 표시하면 제대로 작동했습니다!

Bash 기록을 스크롤하는 데 더 이상 문제가 없습니다.

나쁜 예:PS1="\e[0;36m[\u@\h[\e[1;31m$ORACLESID\e[0;36m] \W]\e[0m"; PS1 내보내기

좋은 예:PS1="\[\e[0;36m\][\u@\h[\[\e[1;31m\]$ORACLESID\[\e[0;36m\]]\W]\[\e [0m\] "; PS1 내보내기

관련 정보