PS1을 비동기식으로 채우기

PS1을 비동기식으로 채우기

저장소에서 가져오거나 저장소로 푸시해야 하는지 확인하기 위해 git svn과 관련된 몇 가지 기능이 있습니다.

제 문제는 이 정보를 수집하기 위해 제가 작성한 함수가 너무 느리다는 것입니다. PS1기본값이 표시 되도록 비동기식으로 만들고 싶지만 함수에 의해 생성된 데이터가 준비되면 인쇄되도록 하고 싶습니다.

나는 프롬프트에 이 정보를 포함하고 싶습니다. 예를 들어, git svn fetch매번 끌어오지 않고도 당겨야 하는지 알 수 있기 때문입니다.

변경 사항을 푸시해야 하는 경우 이 함수를 호출하여 PS1에 ↑를 추가합니다.

function hasToPush {
    (($1 == 0)) && 
        (git svn dcommit --dry-run 2>/dev/null | grep -q "diff-tree" && echo "↑")
}

당겨야 하는 경우에는 이 함수를 호출하여 ↓를 추가합니다. 첫 번째는 2분마다 인덱스를 새로 고치는 데 사용되므로 확인할 수 있습니다 (($latest > $current)).

function loopingGitSvnFetch {
     sleep 120
     git svn fetch &>/dev/null
}
loopingGitSvnFetch &
function hasToPull {
    (($1 == 0)) && (
        latest=$(git svn log | awk 'NR==2' | cut -d ' ' -f1 | tr -d 'r')
        current=$2
        (($latest > $current)) && echo "↓"
    )
}

비동기식으로 만들기 위해 다음과 같이 결합해 보았습니다.

function async {
    {
     git diff-index --quiet --cached HEAD &>/dev/null
     dirty=$(echo $?)
     push=$(hasToPush $dirty)
     gitsvn=$(git svn info 2> /dev/null | grep Revision)
     gitsvn=${gitsvn#Revision: }
     pull=$(hastoPull $dirty $gitsvn)
     callback $push $pull
     } &
 }

그러나 이로 인해 동일한 느린 동작이 발생합니다. 결과를 파일에 담아서 읽어보았지만 이 방식은 마음에 들지 않습니다.

.PROMPT_COMMAND

PS1내가 어떻게 행동하고 있는지, 내가 뭘 잘못하고 있는지 좀 알려줄 수 있나요 ? 미리 감사드립니다.

추신: 300명의 담당자가 async 및 ps1 태그를 추가할 수 있습니까?

편집하다:

간단한 테스트로 .bashrc에 이 줄을 추가했는데 제대로 작동하는 것 같았기 때문에 다시 작성하는 것(이전 시도로 되돌림)이 좋은 것 같았습니다 :)

while true;
do
    discoverScmInfo &>~/.ps1
    sleep 1
done &
PS1='$(customW)$(cat ~/.ps1)\$ '

나는 그것을 함수에 넣고 호출하기 전에 작업이 이미 실행 중인지 확인합니다. 죄송합니다. 결국 제가 필요한 것은 그것을 적어 두는 것뿐입니다. :)

답변1

Re: 초당 루프에 대한 솔루션: 홈 디렉터리에 쓰는 대신 /tmp에 있는 파일에 쓸 수 있습니다. 그러면 PS1=$(customW)$(< ~/.ps1)\$ '저장될 것입니다 cat.

Re: 원래 질문: 비동기 업데이트를 얻는 방법 PS1: 비동기 쓰기를 시작하려면 PS1:

  • PROMPT_COMMAND데이터가 있는지 확인하는 함수로 설정합니다 .
    • 그렇다면 업데이트 PS1하고 설정을 해제하세요.PROMPT_COMMAND
    • 그렇지 않은 경우 PS1이전 값이나 자리 표시자 값이 유지됩니다.

/tmp비동기 IO 쓰기 및 읽기에 파일을 사용합니다 PROMPT_COMMAND.

나는 이것이 효과가 있다고 생각합니다.

관련 정보