Bash $PROMPT_COMMAND가 스크롤 기록 표시를 엉망으로 만듭니다.

Bash $PROMPT_COMMAND가 스크롤 기록 표시를 엉망으로 만듭니다.

PROMPT_COMMANDGit 저장소에 현재 분기를 표시하도록 설정되어 있습니다 .

내 .bashrc의 관련 부분은 다음과 같습니다.

export PS1=" \[\033[34m\]\$\[\033[0m\] "
export PROMPT_COMMAND="$HOME/bin/myprompt"

~/bin/myprompt는 다음과 같습니다.

#!/usr/bin/env ruby
green = "\033[32m"
bold = "\033[1m"
underline = "\033[4m"
reset = "\033[0m"

home_regex = Regexp.new "^#{ENV["HOME"]}"
Dir.chdir ENV["PWD"]

out = 
  underline + bold + green +
  `pwd`.gsub(home_regex, "~").chomp +
  reset

if `git log 2>&1 | grep ^fatal`.chomp == ""
  out += "#{underline}#{green} (#{`git branch | grep ^\* | sed s/^..//g`.chomp})#{reset}"
end

print out

대부분의 경우 잘 작동하지만 유일한 문제는 화살표 키를 사용하여 명령 기록을 스크롤할 때 때때로 명령이 내 프롬프트를 덮어쓴다는 것입니다. 다음 세션을 가정합니다.

~ $ pwd
/Users/Adrian
~ $ cd sibilant
~/sibilant (master) $ pwd
/Users/Adrian/sibilant
~/sibilant (master) $

그런 다음 위쪽 화살표를 눌러 명령 기록을 스크롤합니다. 각 행에는 화살표를 한 번 누른 결과가 표시됩니다.

~/sibilant (master) $ pwd
~/sibilant (master) $ cd sibilant
~/spwd

보시다시피, 마지막으로 화살표를 눌렀을 때 프롬프트에 명령이 기록되었습니다.

이 문제를 경험했거나 해결 방법을 아는 사람이 있나요?

답변1

넣지 말고 PROMPT_COMMAND다음과 같이 넣으십시오 PS1.

PS1='$($HOME/bin/myprompt) \[\033[34m\]\$\[\033[0m\] '

에 있으면 PS1bash는 기록을 스크롤할 때 올바르게 다시 그릴 수 있도록 인쇄된 문자 수를 계산합니다. 이것이 bash에 \[\]특수 문자가 있는 이유입니다. 이 문자는 포함된 문자를 인쇄할 수 없다는 것을 bash에게 알려주므로 필요한 경우 프롬프트를 다시 그리는 방법을 bash가 파악하는 데 도움이 됩니다.

명령 대체는 작은따옴표 안에 있습니다. 이렇게 하면 할당 중 확장이 방지됩니다. 명령 대체가 큰따옴표로 묶여 있거나 인용되지 않은 경우 출력은 myprompt할당 시 한 번 캡처되고 정적으로 유지됩니다. 시간이 지남에 따라 변경되는 변수 값을 지원하기 위해 쉘은 PS1프롬프트를 표시할 때마다 값을 확장합니다. 이는 할당 시 참조로 확장을 방지해야 함을 의미합니다. 이는 또한 속도에 주의해야 함을 의미합니다. 명령 대체를 완료하는 데 1초가 걸리면 프롬프트가 표시되는 데 1초가 걸립니다.

답변2

PROMPT_COMMAND에는 bash가 새 프롬프트를 인쇄하기 전(즉, PS1이 평가되기 전) 실행되는 명령이 포함될 수 있습니다.

git 1.8.1에서는 PROMPT_COMMAND를 사용하여 이 작업을 효율적으로 수행하는 코드가 릴리스되었습니다. 바라보다PROMPT_COMMAND와 함께 git-prompt.sh 사용. 이 코드는 이전 버전의 git에서 작동합니다. contrib/completion/git-prompt.sh 파일을 .bashrc에서 가져올 수 있는 위치에 복사하면 됩니다.

건배

사이먼

관련 정보