GNU/Linux >> Linux Esercitazione >  >> Linux

Bash Prompt con il codice dell'ultima uscita

Dato che stai iniziando a rasentare un PS1 complesso, potresti prendere in considerazione l'utilizzo di PROMPT_COMMAND .
Con questo, lo imposti su una funzione e verrà eseguito dopo ogni comando per generare il prompt.

Puoi provare quanto segue nel tuo ~/.bashrc

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

Questo dovrebbe fare quello che sembra la linea che vuoi. Dai un'occhiata al sottofile del mio bashrc se vuoi vedere tutte le cose che faccio con il mio __prompt_command funzione.


Se non vuoi usare il comando prompt ci sono due cose che devi tenere in considerazione:

  1. ottenere il valore di $? prima di ogni altra cosa, altrimenti verrà ignorato
  2. sfuggendo a tutti i $ nella PS1 (quindi non viene valutato quando lo assegni)

Esempio funzionante utilizzando una variabile

PS1="\$(VALU="\$?" ; echo \$VALU ; date ; if [ \$VALU == 0 ]; then echo zero; else echo nonzero; fi) " 

Esempio funzionante senza una variabile

Qui l'if deve essere la prima cosa, prima di qualsiasi comando che sovrascriverebbe il $? .

PS1="\$(if [ \$? == 0 ]; then echo zero; else echo nonzero; fi) "

Nota come il \$() è sfuggito quindi non viene eseguito immediatamente ma ogni volta che viene utilizzato PS1. Anche tutti gli usi di \$?


Volevo mantenere i colori Debian predefiniti, stampare il codice esatto e stamparlo solo in caso di errore:

# 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. Codici di uscita della riga di comando di Bash demistificati

  2. Come abbreviare il prompt di Bash in Linux?

  3. Bash -c con parametri posizionali?

  4. basename con spazi in uno script bash?

  5. Elimina la password inserita nel prompt della password nascosta (Linux) con scorciatoia

Come personalizzare il prompt di Bash in Linux

Comando di uscita Bash e codici di uscita

Codice di uscita dall'assegnazione della variabile alla sostituzione dei comandi in Bash

L'applicazione C++ termina con il codice di uscita 143:cosa significa?

Arrotondamento dei numeri con bc in Bash

if con regex nel codice bash