Die Eingabeaufforderung für die PS1 wird aktualisiert

489
AlonCo

Ich möchte, dass meine Eingabeaufforderung basierend auf der Ausgabe eines bestimmten Befehls geändert wird. und basierend auf dem Befehlsergebnis, um eine Farbe hinzuzufügen.

Beispiel:
Führen Sie den Befehl aus:

cphaprob stat | grep local | awk '{ print $NF }'` 

(hier wird nur das letzte Wort angezeigt.

Wenn das Ergebnis "Aufmerksamkeit" ist, möchte ich, dass die Aufforderung lautet:

PS1='[\t][\u@\h]\[\e[0;92m\][attention]\[\e[0m\]# ' 

Das Wort "Aufmerksamkeit" wird also grün sein.

Wenn das Wort jedoch "down" ist, möchte ich, dass die Eingabeaufforderung in einer anderen Farbe angezeigt wird:

PS1='[\t][\u@\h]\[\e[4;91m\][Down]\[\e[0m\]# ' 

Ich möchte, dass die Änderung in jeder neuen Zeile "on-the-fly" bedeutet (Drücken der Eingabetaste). Ich möchte, dass die Eingabeaufforderung basierend auf dem Ergebnis aktualisiert wird.

Wenn möglich sollte dies irgendwie dauerhaft über .bashrc gemacht werden.

Irgendwelche Ideen, wie es funktioniert?

0

2 Antworten auf die Frage

0
jlliagre

Das funktioniert für mich (mit bash 4.2.37):

PS1='[\t][\u@\h][$(i=$(cphaprob stat|grep local|awk "") u=0 case $i in (Active|attention) c=92;; (Down|Error) u=4; c=91;; (Standby) c=93;; (Ready) c=94;; (*) c=95 ;; esac printf "\033[%s;%sm%s\033[0m" $u $c $i )]# ' 
Sind "Aufmerksamkeit" und "Abwärts" die einzig möglichen Werte? jlliagre vor 10 Jahren 0
Welche Farben erwarten Sie für die anderen Werte? jlliagre vor 10 Jahren 0
Antwort aktualisiert jlliagre vor 10 Jahren 0
Antwort nochmals aktualisiert und einfacher gemacht. Sie sollten diesen Code so eingeben, wie er in Ihrer .bashrc ist, was bedeutet, dass Sie den Backslash in `\ $ NF` nicht verdoppeln sollten. jlliagre vor 10 Jahren 0
Hallo, Wenn ich den doppelten Backslash nicht setze, erhalte ich einen Syntaxfehler. Gibt es eine Möglichkeit, hier zu chatten? Ich brauche ein paar Erklärungen. Vielen Dank AlonCo vor 10 Jahren 0
Welches Betriebssystem und welche Shell verwenden Sie (genau)? jlliagre vor 10 Jahren 0
und haben Sie gerade diesen Code in Sie .bashrc geschnitten und eingefügt oder haben Sie etwas anderes getan? Welche genaue Fehlermeldung haben Sie erhalten? jlliagre vor 10 Jahren 0
Es ist CheckPoint Firewall Gaia Bash. Woher weiß ich, welche bash-version ich verwende? AlonCo vor 10 Jahren 0
Dieser hat es gut gemacht. PS1 = '[\ t] [Expert @ $ HOSTNAME] $ (i = $ (cphaprob stat | grep local | awk "") Fall $ i in (Achtung) printf "\ [\ e [ 4; 92m \] [aktive Aufmerksamkeit] \ [\ e [0m \] ";; (aktiv) printf \ [\ e [0; 92m \] [aktiv] \ [\ e [0m \]"; Standby) printf "\ [\ e [0; 93m \] [Standby] \ [\ e [0m \]";; (Down) printf "\ [\ e [4; 91m \] [Down] \ [\ e [0m \] ";; (Ready) printf" \ [\ e [4; 96m \] [Ready] \ [\ e [0m \] ";; (*) printf" \ [\ e [0; 101m \ ] [Fehler] \ [\ e [0m \] ";; esac) # ' AlonCo vor 10 Jahren 0
Ich bin froh, dass du es geschafft hast. Um zu wissen, welche bash-Version Sie verwenden, führen Sie `bash --version` aus. jlliagre vor 10 Jahren 0
0
daBeamer

Sie müssen sowohl die PROMPT_COMMANDVariable als auch die PS1Variable nutzen, um die PS1Variable darin neu zu definieren PROMPT_COMMAND. Ich werde Sie auf andere Antworten verweisen lassen, um genau zu erfahren, wie Sie Ihre speziellen Anforderungen erfüllen können. Dies löst jedoch die Anforderung zur Aktualisierung "on-the-fly" auf. Dies war eine Herausforderung, der ich beim Durcharbeiten begegnet bin, einschließlich des Exit-Status in jeder neuen Eingabeaufforderung (falls nicht Null).

Zum Beispiel wird in meiner Bash-Konfigurationsdatei eine PS1-Eingabeaufforderung erstellt, die anschließend mit dem folgenden Befehl festgelegt wird (wobei variable ps1für das steht, was meine PS1Variable sein soll):

export PROMPT_COMMAND="export PS1=\"$ps1\"" 

Hier ist meine vollständige .bash_promptDatei als Referenz (die ich einfach beifüge .bashrc): https://gist.github.com/austinbeam/10930268