GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Ps1 asynchron füllen?

Ich habe ein paar git svn-bezogene Funktionen, die sehen, ob ich vom/zum Repository ziehen/pushen muss.

Mein Problem ist, dass die Funktionen, die ich geschrieben habe, um diese Informationen zu sammeln, zu langsam sind. Ich möchte sie asynchron machen, damit PS1 zeigt eine Voreinstellung, wenn die von den Funktionen erzeugten Daten fertig sind, möchte ich sie gedruckt haben.

Ich möchte diese Informationen in meiner Eingabeaufforderung haben – damit ich zum Beispiel weiß, ob ich ziehen muss – ohne einen git svn fetch durchzuführen immer.

Dies ist die Funktion, die ich aufrufe, um meiner PS1 ein ↑ hinzuzufügen, wenn ich meine Änderungen pushen muss.

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

Dies sind die Funktionen, die ich aufrufe, um ein ↓ hinzuzufügen, wenn ich ziehen muss. Der erste wird verwendet, um meinen Index alle 2 Minuten zu aktualisieren, damit ich (($latest > $current)) ausführen kann prüfen.

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

Um sie asynchron zu machen, habe ich versucht, sie wie folgt zusammenzusetzen:

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

Aber das führt zu demselben langsamen Verhalten.
Ich habe versucht, Ergebnisse in eine Datei zu schreiben und sie danach zu lesen, aber ich mag diesen Ansatz nicht.

Ich habe darüber nachgedacht, PROMPT_COMMAND zu verwenden . Aber das wäre nicht asynchron; es wäre auf Anfrage.

Könntest du etwas Licht ins Dunkel bringen, wie PS1 verhält oder was ich falsch mache?
Vielen Dank im Voraus.

PS:Könnte jemand mit 300 Wiederholungen die async- und ps1-Tags hinzufügen?

BEARBEITEN:

Ich habe diese Zeile als einfachen Test zu meiner .bashrc hinzugefügt, es schien zu funktionieren, also scheint es eine gute Sache gewesen zu sein, sie neu zu schreiben (ich habe meinen vorherigen Versuch rückgängig gemacht) 🙂

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

Ich baue das in eine Funktion und prüfe, ob der Job bereits läuft, bevor ich ihn aufrufe.
Tut mir leid, schließlich musste ich anscheinend nur darüber schreiben. 🙂

Verwandte:Warum wird STDERR auf diese Weise nach /dev/null umgeleitet?

Akzeptierte Antwort:

Betreff:Ihre Lösung für eine Schleife jede Sekunde:Sie könnten in eine Datei in /tmp schreiben, anstatt in Ihr Home-Verzeichnis. Und PS1=$(customW)$(< ~/.ps1)\$ ' würde einen Fork/Exec von cat speichern .

Re:die ursprüngliche Frage:Wie bekomme ich ein asynchrones Update auf PS1 :
Um ein asynchrones Schreiben auf PS1 zu starten :

  • set PROMPT_COMMAND an eine Funktion, die prüft, ob die Daten vorhanden sind.
    • Falls ja, aktualisieren Sie PS1 und setzen Sie PROMPT_COMMAND zurück
    • Falls nicht, verlassen Sie PS1 mit dem alten oder Platzhalterwert.

Verwenden Sie eine Datei in /tmp für das asynchrone IO zum Schreiben und PROMPT_COMMAND zu lesen.

Ich denke, das sollte funktionieren.


Linux
  1. Die digitale Welt verstehen:Meine ehrliche Buchbesprechung

  2. Verwalten Sie die Home-Verzeichnisse von Linux-Benutzern mit systemd-homed

  3. Kleben Sie Haftnotizen auf Ihren Linux-KDE-Desktop

  4. Bash überschreibt die erste Zeile, Ps1 Bash Prompt?

  5. Wie erzeuge ich eine Ps1-Eingabeaufforderung in Bash oder Ksh93 ähnlich wie Tcsh?

Wie ich Familienfotos unter Linux scanne

Wie ich meine Linux-Fensterdekorationen anpasse

Meine bevorzugten Linux-Top-Befehlsoptionen

Bash Shell PS1:10 Beispiele, um Ihr Linux wie Angelina Jolie zu machen

Pushing meiner PS1-Eingabeaufforderung über ssh

Was ist der richtige Speicherort für die PS1-Shell-Variable?