Wenn Sie anfangen, an eine komplexe PS1 zu grenzen, sollten Sie die Verwendung von PROMPT_COMMAND
in Betracht ziehen .
Damit setzen Sie es auf eine Funktion, die nach jedem Befehl ausgeführt wird, um die Eingabeaufforderung zu generieren.
Sie könnten Folgendes in Ihrem ~/.bashrc
versuchen
PROMPT_COMMAND=__prompt_command # Func to gen PS1 after CMDs
__prompt_command() {
local EXIT="$?" # This needs to be first
PS1=""
local RCol='\[\e[0m\]'
local Red='\[\e[0;31m\]'
local Gre='\[\e[0;32m\]'
local BYel='\[\e[1;33m\]'
local BBlu='\[\e[1;34m\]'
local Pur='\[\e[0;35m\]'
if [ $EXIT != 0 ]; then
PS1+="${Red}\u${RCol}" # Add red if exit code non 0
else
PS1+="${Gre}\u${RCol}"
fi
PS1+="${RCol}@${BBlu}\h ${Pur}\W${BYel}$ ${RCol}"
}
Dies sollte das tun, was die gewünschte Zeile klingt. Werfen Sie einen Blick auf die Unterdatei meines bashrc, wenn Sie alle Dinge sehen möchten, die ich mit meinem __prompt_command
mache Funktion.
Wenn Sie den Eingabeaufforderungsbefehl nicht verwenden möchten, müssen Sie zwei Dinge berücksichtigen:
- Den Wert von $ bekommen? vor allem anderen, sonst wird es überschrieben
- alle $'s in der PS1 mit Escapezeichen versehen (daher wird es nicht ausgewertet, wenn Sie es zuweisen)
Arbeitsbeispiel mit einer Variablen
PS1="\$(VALU="\$?" ; echo \$VALU ; date ; if [ \$VALU == 0 ]; then echo zero; else echo nonzero; fi) "
Arbeitsbeispiel ohne Variable
Hier muss das if das erste sein, vor jedem Befehl, der $?
überschreiben würde .
PS1="\$(if [ \$? == 0 ]; then echo zero; else echo nonzero; fi) "
Beachten Sie, wie der \$()
wird maskiert, sodass es nicht sofort ausgeführt wird, sondern jedes Mal, wenn PS1 verwendet wird. Auch alle Verwendungen von \$?
Ich wollte die Standard-Debian-Farben beibehalten, den genauen Code drucken und ihn nur bei einem Fehler drucken:
# Show exit status on failure.
PROMPT_COMMAND=__prompt_command
__prompt_command() {
local curr_exit="$?"
local BRed='\[\e[0;91m\]'
local RCol='\[\e[0m\]'
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\[email protected]\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
if [ "$curr_exit" != 0 ]; then
PS1="[${BRed}$curr_exit${RCol}]$PS1"
fi
}