GNU/Linux >> Linux Esercitazione >  >> Linux

Popolare Ps1 in modo asincrono?

Ho alcune funzioni relative a git svn che vedono se devo eseguire il pull/push da/verso il repository.

Il mio problema è che le funzioni che ho scritto per raccogliere queste informazioni sono troppo lente. Vorrei renderli asincroni in modo che PS1 mostra un default, se però i dati prodotti dalle funzioni sono pronti voglio che vengano stampati.

Vorrei avere queste informazioni nel mio prompt, in modo che, ad esempio, sappia se devo eseguire il pull, senza eseguire un git svn fetch ogni volta.

Questa è la funzione che chiamo per aggiungere un ↑ alla mia PS1 se devo eseguire il push delle mie modifiche.

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

Queste sono le funzioni che chiamo per aggiungere un ↓ se devo tirare. Il primo viene utilizzato per aggiornare il mio indice ogni 2 minuti in modo da poter eseguire (($latest > $current)) controlla.

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

Per renderli asincroni, ho provato a metterli insieme in questo modo:

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

Ma questo produce lo stesso comportamento lento.
Ho provato a inserire i risultati in un file e poi a leggerlo, ma questo approccio non mi piace.

Ho pensato di usare PROMPT_COMMAND . Ma non sarebbe asincrono; sarebbe su richiesta.

Potresti far luce su come PS1 si comporta o su cosa sbaglio?
Grazie in anticipo.

PS:qualcuno con 300 rappresentanti potrebbe aggiungere i tag async e ps1?

MODIFICA:

Ho aggiunto queste righe al mio .bashrc come semplice test, sembrava funzionare, quindi averle riscritte (ho ripristinato il mio precedente tentativo) sembra essere stata una buona cosa 🙂

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

Lo inserirò in una funzione e verificherò se il lavoro è già in esecuzione prima di chiamarlo.
Mi dispiace per questo, dopotutto sembra che tutto ciò di cui avevo bisogno fosse scriverlo. 🙂

Correlati:perché il reindirizzamento di STDERR a /dev/null viene eseguito in questo modo?

Risposta accettata:

re:la tua soluzione di un ciclo ogni secondo:potresti scrivere su un file in /tmp, invece che nella tua home directory. E PS1=$(customW)$(< ~/.ps1)\$ ' salverebbe un fork/exec di cat .

re:la domanda originale:come ottenere un aggiornamento asincrono su PS1 :
Per avviare un asincrono, scrivi su PS1 :

  • imposta PROMPT_COMMAND a una funzione che controlla se i dati sono disponibili.
    • Se lo è, aggiorna PS1 e deseleziona PROMPT_COMMAND
    • In caso contrario, lascia PS1 con il valore vecchio o segnaposto.

Usa un file in /tmp per l'IO asincrono in cui scrivere e PROMPT_COMMAND da cui leggere.

Penso che dovrebbe funzionare.


Linux
  1. Come Linux salva i computer lenti (e il pianeta)

  2. Inizia con NetworkManager su Linux

  3. Capire il mondo digitale:la mia recensione onesta del libro

  4. Gestisci le home directory degli utenti Linux con systemd-homed

  5. Metti note adesive sul tuo desktop KDE Linux

Come eseguo la scansione delle foto di famiglia su Linux

Come personalizzo le decorazioni delle mie finestre Linux

Pianificazione delle attività con il comando cron di Linux

Le mie opzioni di comando principali di Linux preferite

Bash Shell PS1:10 esempi per rendere il tuo Linux Prompt come Angelina Jolie

Bash Shell:prendi il controllo di PS1, PS2, PS3, PS4 e PROMPT_COMMAND