GNU/Linux >> Tutoriels Linux >  >> Linux

Invite Bash avec le dernier code de sortie

Comme vous commencez à frôler une PS1 complexe, vous pourriez envisager d'utiliser PROMPT_COMMAND .
Avec cela, vous le définissez sur une fonction, et elle sera exécutée après chaque commande pour générer l'invite.

Vous pouvez essayer ce qui suit dans votre ~/.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}"
}

Cela devrait faire ce que vous voulez. Jetez un œil au sous-fichier de mon bashrc si vous voulez voir tout ce que je fais avec mon __prompt_command fonction.


Si vous ne souhaitez pas utiliser la commande prompt, vous devez tenir compte de deux éléments :

  1. obtenir la valeur de $ ? avant toute autre chose, sinon il sera remplacé
  2. en échappant tous les $ dans la PS1 (afin qu'ils ne soient pas évalués lorsque vous l'assignez)

Exemple de travail utilisant une variable

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

Exemple de travail sans variable

Ici, le if doit être la première chose, avant toute commande qui remplacerait le $? .

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

Remarquez comment le \$() est échappé donc il n'est pas exécuté tout de suite mais à chaque fois que PS1 est utilisé. Aussi toutes les utilisations de \$?


Je voulais conserver les couleurs Debian par défaut, imprimer le code exact et ne l'imprimer qu'en cas d'échec :

# 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. Comment raccourcir l'invite Bash sous Linux ?

  2. Bash -c avec des paramètres positionnels ?

  3. Comment Bash évaluera-t-il le code suivant ?

  4. Que sont les codes de sortie Bash sous Linux

  5. nom de base avec des espaces dans un script bash ?

Comment personnaliser l'invite Bash sous Linux

Commande de sortie Bash et codes de sortie

Bash :attendre avec un délai d'attente

Pourquoi quitter le code 141 avec grep -q ?

L'application C++ se termine avec le code de sortie 143 - qu'est-ce que cela signifie ?

Arrondir les nombres avec bc dans Bash