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

Bash-Eingabeaufforderung mit letztem Exit-Code

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:

  1. Den Wert von $ bekommen? vor allem anderen, sonst wird es überschrieben
  2. 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
}

Linux
  1. Bash-Befehlszeilen-Exit-Codes entmystifiziert

  2. Wie kürze ich die Bash-Eingabeaufforderung unter Linux?

  3. Bash -c mit Positionsparametern?

  4. Was sind Bash-Exit-Codes in Linux

  5. Alias ​​mit Variable in Bash

So passen Sie die Bash-Eingabeaufforderung unter Linux an

Bash Exit-Befehl und Exit-Codes

Basisname mit Leerzeichen in einem Bash-Skript?

C++-Anwendung wird mit Exit-Code 143 beendet – was bedeutet das?

Löschen Sie das eingegebene Passwort in der versteckten Passwortabfrage (Linux) mit einem Shortcut

wenn mit Regex im Bash-Code