GNU/Linux >> Tutoriels Linux >  >> Linux

Remplir Ps1 de manière asynchrone ?

J'ai quelques fonctions liées à git svn qui voient si je dois tirer/pousser depuis/vers le référentiel.

Mon problème est que les fonctions que j'ai écrites pour recueillir ces informations sont trop lentes. Je voudrais les rendre asynchrones pour que PS1 affiche une valeur par défaut, si bien que les données produites par les fonctions soient prêtes, je veux qu'elles soient imprimées.

J'aimerais avoir ces informations dans mon invite - pour que, par exemple, je sache si je dois tirer - sans faire de git svn fetch à chaque fois.

C'est la fonction que j'appelle pour ajouter un ↑ à ma PS1 si je dois pousser mes modifications.

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

Ce sont les fonctions que j'appelle pour ajouter un ↓ si je dois tirer. Le premier sert à rafraîchir mon index toutes les 2 minutes pour que je puisse faire le (($latest > $current)) vérifier.

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

Pour les rendre asynchrones, j'ai essayé de les assembler comme ceci :

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

Mais cela produit le même comportement lent.
J'ai essayé de mettre les résultats dans un fichier et de les lire ensuite, mais je n'aime pas cette approche.

J'ai pensé à utiliser PROMPT_COMMAND . Mais ce ne serait pas asynchrone; ce serait sur demande.

Pourriez-vous nous éclairer sur la façon dont PS1 se comporte ou sur ce que je fais mal ?
Merci d'avance.

PS :Quelqu'un avec 300 représentants pourrait-il ajouter les balises async et ps1 ?

MODIFIER :

J'ai ajouté ces lignes à mon .bashrc comme un simple test, cela semblait fonctionner, donc les avoir réécrites (j'ai annulé ma tentative précédente) semble être une bonne chose 🙂

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

Je vais mettre cela dans une fonction et vérifier si le travail est déjà en cours d'exécution avant de l'appeler.
Désolé pour cela, après tout, il semble que tout ce dont j'avais besoin était d'écrire à ce sujet. 🙂

En relation :Pourquoi la redirection de STDERR vers /dev/null est-elle effectuée de cette façon ?

Réponse acceptée :

re :votre solution d'une boucle toutes les secondes :vous pouvez écrire dans un fichier dans /tmp, au lieu de dans votre répertoire personnel. Et PS1=$(customW)$(< ~/.ps1)\$ ' économiserait un fork/exec de cat .

re :la question d'origine :comment obtenir une mise à jour asynchrone sur PS1 :
Pour démarrer une écriture asynchrone sur PS1 :

  • définir PROMPT_COMMAND à une fonction qui vérifie si les données sont disponibles.
    • Si c'est le cas, mettez à jour PS1 et désélectionnez PROMPT_COMMAND
    • Sinon, laissez PS1 avec l'ancienne valeur ou l'espace réservé.

Utiliser un fichier dans /tmp pour l'E/S asynchrone à écrire, et PROMPT_COMMAND à lire.

Je pense que cela devrait fonctionner.


Linux
  1. Comprendre le monde numérique :ma critique de livre honnête

  2. Gérez les répertoires personnels des utilisateurs Linux avec systemd-homed

  3. Mettez des notes autocollantes sur votre bureau Linux KDE

  4. Comment produire une invite Ps1 dans Bash ou Ksh93 similaire à Tcsh ?

  5. Remplir Ps1 de manière asynchrone ?

Comment numériser des photos de famille sous Linux

Comment je personnalise mes décorations de fenêtre Linux

Mes options de commande Linux préférées

Bash Shell PS1 :10 exemples pour rendre votre invite Linux comme Angelina Jolie

Bash Shell :prenez le contrôle de PS1, PS2, PS3, PS4 et PROMPT_COMMAND

Quel est l'emplacement correct pour la variable Shell PS1 ?