GNU/Linux >> Znalost Linux >  >> Linux

Naplnit Ps1 asynchronně?

Mám několik funkcí souvisejících s git svn, které zjišťují, zda musím stahovat/tlačit z/do úložiště.

Můj problém je v tom, že funkce, které jsem napsal ke shromažďování těchto informací, jsou příliš pomalé. Chtěl bych je nastavit jako asynchronní, aby PS1 zobrazuje výchozí, pokud jsou data vytvořená funkcemi připravena, chci je vytisknout.

Chtěl bych mít tyto informace ve výzvě – abych například věděl, zda musím stáhnout – aniž bych musel provádět git svn fetch pokaždé.

Toto je funkce, kterou volám, abych přidal ↑ do mého PS1, pokud musím provést změny.

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

Toto jsou funkce, které volám, abych přidal ↓, pokud musím táhnout. První se používá k aktualizaci mého indexu každé 2 minuty, abych mohl provést (($latest > $current)) zkontrolovat.

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 "↓"
    )
}

Aby byly asynchronní, pokusil jsem se je sestavit takto:

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
     } &
 }

To však vede ke stejně pomalému chování.
Zkoušel jsem vložit výsledky do souboru a poté si jej přečíst, ale tento přístup se mi nelíbí.

Přemýšlel jsem o použití PROMPT_COMMAND . Ale to by nebylo asynchronní; bylo by to na vyžádání.

Mohl byste osvětlit, jak PS1 chová nebo co dělám špatně?
Předem děkuji.

PS:Mohl by někdo s 300 rep. přidat značky async a ps1?

EDIT:

Přidal jsem tyto řádky do svého .bashrc jako jednoduchý test, zdálo se, že to funguje, takže jejich přepsání (vrátil jsem svůj předchozí pokus) se zdá být dobrá věc 🙂

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

Vložím to do funkce a zkontroluji, zda úloha již běží, než ji zavolám.
Omlouvám se za to, nakonec se zdá, že vše, co jsem potřeboval, bylo o tom napsat. 🙂

Související:Proč se přesměrování STDERR na /dev/null provádí tímto způsobem?

Přijatá odpověď:

re:vaše řešení smyčky každou sekundu:můžete zapisovat do souboru v /tmp místo do vašeho domovského adresáře. A PS1=$(customW)$(< ~/.ps1)\$ ' by uložil fork/exec cat .

re:původní otázka:jak získat asynchronní aktualizaci na PS1 :
Pro spuštění asynchronního zápisu do PS1 :

  • nastavte PROMPT_COMMAND na funkci, která kontroluje, zda jsou data dostupná.
    • Pokud ano, aktualizujte PS1 a zrušte nastavení PROMPT_COMMAND
    • Pokud ne, opusťte PS1 se starou nebo zástupnou hodnotou.

Použijte soubor v /tmp pro asynchronní IO, do kterého se má zapisovat, a PROMPT_COMMAND ke čtení.

Myslím, že by to mělo fungovat.


Linux
  1. Understanding the Digital World:Moje upřímná recenze knihy

  2. Spravujte domovské adresáře uživatelů Linuxu pomocí systemd-homed

  3. Nalepte si poznámky na plochu Linux KDE

  1. Mohu v Bash asynchronně otevřít zásuvky a použít je později?

  2. Zvýraznit oddělovače cest v Ps1?

  3. Jak vytvořit výzvu Ps1 v Bash nebo Ksh93 podobné Tcsh?

  1. Bash přepíše první řádek, výzva k bashu Ps1?

  2. Naplnit Ps1 asynchronně?

  3. Jaký je symbol nového řádku v Zsh Ps1?