GNU/Linux >> Linux の 問題 >  >> Linux

Ps1に非同期でデータを入力しますか?

リポジトリからプル/プッシュする必要があるかどうかを確認するgitsvn関連の関数がいくつかあります。

私の問題は、この情報を収集するために作成した関数が遅すぎることです。 PS1になるように、それらを非同期にします 関数によって生成されたデータの準備ができていても、印刷したい場合は、デフォルトを表示します。

git svn fetchを実行せずに、これらの情報をプロンプトに表示したいのですが、たとえば、プルする必要があるかどうかがわかります。 毎回。

これは、変更をプッシュする必要がある場合にPS1に↑を追加するために呼び出す関数です。

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

これらは、プルする必要がある場合に↓を追加するために呼び出す関数です。 1つ目は、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 repの誰かが、非同期タグとps1タグを追加できますか?

編集:

簡単なテストとしてこれらの行を.bashrcに追加しましたが、機能しているように見えたので、書き直した(以前の試行を元に戻した)のは良いことのようです🙂

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

これを関数に入れて、呼び出す前にジョブがすでに実行されているかどうかを確認します。
申し訳ありませんが、結局のところ、必要なのはそれについて書くことだけだったようです。 🙂

関連:STDERRを/ dev / nullにリダイレクトするのはなぜこのようになっているのですか?

承認された回答:

re:毎秒ループの解決策:ホームディレクトリではなく、/tmpにあるファイルに書き込むことができます。そしてPS1=$(customW)$(< ~/.ps1)\$ ' catのフォーク/実行を保存します 。

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

  • PROMPT_COMMANDを設定します データが利用可能かどうかをチェックする関数に。
    • そうである場合は、PS1を更新します PROMPT_COMMANDの設定を解除します
    • そうでない場合は、PS1のままにします 古い値またはプレースホルダー値を使用します。

/tmp内のファイルを使用します 非同期IOに書き込むための、およびPROMPT_COMMAND 読むために。

これでうまくいくと思います。


Linux
  1. Bashは最初の行を上書きします、Ps1 Bashプロンプト?

  2. Bashでは、ソケットを非同期で開いて後で使用できますか?

  3. Ps1のパスセパレータを強調表示しますか?

  1. Linuxが遅いコンピューター(そして地球)を救う方法

  2. LinuxでNetworkManagerを使い始める

  3. デジタル世界を理解する:私の正直な書評

  1. systemd-homedを使用してLinuxユーザーのホームディレクトリを管理する

  2. LinuxKDEデスクトップに付箋を貼る

  3. Tcshと同様にBashまたはKsh93でPs1プロンプトを生成する方法は?