web-dev-qa-db-fra.com

Imprimer la valeur de retour après l'exécution du programme

Je me demande comment configurer l'option pour imprimer automatiquement la valeur de retour après chaque exécution de programme dans le terminal sans taper echo $?.

Est-ce quelque chose qui peut être configuré? Codeblocks a cette fonctionnalité.

9
mr.backy

Oui, il y a deux façons. L'une consiste à définir Prompt_COMMAND dans .bashrc, l'autre - à définir la substitution de commande dans PS1 pour la commande echo $?.

Méthode 1:

De la page de manuel de bash:

Prompt_COMMAND

      If set, the value is executed as a command prior to issuing each
      primary Prompt.

Quoi que vous définissiez à cette variable, sera exécuté avant de générer l'invite à chaque fois. Démo:

$> Prompt_COMMAND=" echo 'Last command exited with'  \$? 'code'  "
Last command exited with 0 code
$> ls /etc/passwd > /dev/null
Last command exited with 0 code
$> ls /etc/asdf > /dev/null
ls: cannot access /etc/asdf: No such file or directory
Last command exited with 2 code
$> 

Notez l'utilisation de \$?. Pour un changement permanent, enregistrez-le dans .bashrc

Méthode 2

Supposons que mon invite PS1 soit définie comme suit:

PS1='
user@ubuntu:$> '

Si je veux exécuter un programme chaque fois que cette invite est redessinée à l'écran (c'est-à-dire après l'exécution de chaque commande précédente), j'aurais besoin d'utiliser command substitution $(. . .) et de la définir dans l'invite de la manière suivante:

PS1=' [ $? ] 
user@ubuntu: $> '

Démo:

$> PS1=' [ $? ]
> $>_ '
 [ 0 ]
$>_ ls /etc/passwd > /dev/null
 [ 0 ]
$>_ ls /etc/asdf > /dev/null                                                                                                      
ls: cannot access /etc/asdf: No such file or directory
 [ 2 ]
$>_ 

Notez que je scinde ma PS1 en deux lignes, le haut aura [ exitcode ] et le bas $> <blank space>'. C’est pourquoi il y a > avant $> ' sur la deuxième ligne (le > initial est PS2 Invite pour les commandes multilignes). Vous pouvez également faire quelque chose comme ceci (notez la structure $'...'):

  $> PS1=$'[ $? ] \n$> '                                                                                                  
[ 0 ] 
$> 
10
Sergiy Kolodyazhnyy

Une méthode que j'ai choisie the Arch Wiki consiste à trapERR. trap est utilisé dans Bash pour exécuter des commandes lorsqu'un signal est reçu ou pour certains autres événements. Une interruption ERR est exécutée chaque fois que la ligne de commande en cours se termine par une erreur - la valeur de retour n'est pas 0. (Si elle s'est terminée normalement, la valeur de retour serait évidemment 0.)

Donc, par exemple:

trap 'printf "\ncode %d\n\n" $?' ERR

Ensuite:

$ echo foo
foo
$ false

code 1

$

(Remarque: aucun message après la commande echo qui a abouti - Qu'est-ce que cela signifie quand je tape une commande et que le terminal ne fait rien? )

Le conseil d'Arch Wiki est allé de l'avant et a coloré le message afin que vous obteniez un message jaune visible:

EC() { echo -e '\e[1;33m'code $?'\e[m\n'; }
trap EC ERR

Effet:

enter image description here

En fait, tout ce que j'ai à faire est de garder un œil sur un code jaune dans la sortie pour savoir qu'une commande a échoué.

4
muru