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私がどのように行動しているのか、何が間違っているのかを教えてください。よろしくお願いします。

PS:300人の担当者がasyncタグとps1タグを追加できますか?

編集する:

簡単なテストで.bashrcにこの行を追加しましたが、うまく動作しているようだったので、書き直すこと(以前の試みに戻る)が良いようです:)

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

私はそれを関数に入れて、呼び出す前にタスクがすでに実行されていることを確認します。申し訳ありません。結局、私が必要なのはそれを書き留めておくだけです。 :)

ベストアンサー1

Re:1秒あたりのループの解決策:ホームディレクトリに書き込むのではなく、/ tmpのファイルに書き込むことができます。これでPS1=$(customW)$(< ~/.ps1)\$ '保存されますcat

Re:元の質問:非同期アップデートを取得する方法PS1:非同期書き込みを開始するにはPS1

  • PROMPT_COMMANDデータがあるかどうかを確認する関数に設定します。
    • その場合は、アップデートしPS1て設定を解除してください。PROMPT_COMMAND
    • それ以外の場合は、PS1前の値またはプレースホルダの値が保持されます。

/tmp非同期IOの書き込みと読み取りにファイルを使用しますPROMPT_COMMAND

私はこれがうまくいくと思います。

おすすめ記事