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

9

Je me demande comment définir 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é.

monsieur backy
la source

Réponses:

10

Oui, il y a deux façons. L' un est de mettre PROMPT_COMMANDen .bashrc, l'autre - à la substitution de commandes en jeu PS1pour la echo $?commande.

Méthode 1:

Depuis 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 dessiner 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 PS1invite soit définie comme ceci:

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 chaque exécution de commande précédente), je devrais l'utiliser command substitution $(. . .) et la définir dans l'invite comme suit :

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 j'ai divisé ma PS1 en deux lignes, en haut [ exitcode ]et en bas $> <blank space>'. C'est pourquoi il y a >avant $> 'sur la deuxième ligne (le premier >est une PS2invite pour les commandes multilignes). Alternativement, vous pouvez faire quelque chose comme ça (remarquez la $'...'structure):

  $> PS1=$'[ $? ] \n$> '                                                                                                  
[ 0 ] 
$> 
Sergiy Kolodyazhnyy
la source
+1 Cela fonctionne réellement. Je ne doute pas de quelqu'un ayant une réputation de 27k, mais apparemment, l'invite n'est pas une "commande", donc en utilisant $? en elle ne reçoit pas $? remis à zéro comme je le pensais - même en utilisant la première méthode qui exécute l'écho sans erreur.
Joe
PS1est juste du texte qui est imprimé avant d'obtenir une entrée utilisateur - rien de plus que cela. Il n'est pas à l'abri de l'expansion des paramètres et des substitutions de commandes, vous pouvez donc y mettre quelque chose $(...), par exemple, $( pwd )et cela s'afficherait. Je l'ai utilisé avec un script personnalisé pour montrer la puissance de la batterie d'un ordinateur portable, par exemple
Sergiy Kolodyazhnyy
@mchid que voulez-vous dire?
Sergiy Kolodyazhnyy
1
@mchid "Avant d'émettre chaque invite principale", donc après l'exécution de la dernière commande.
kos
1
@mchid est exécuté avant l'impression de l'invite - donc avant de saisir la commande suivante.
muru
4

Une méthode que j'ai choisie dans l'Archiki Wiki est de trap ERR. trapest utilisé dans Bash pour exécuter des commandes lorsqu'un signal est reçu, ou pour certains autres événements. Une ERRinterruption est exécutée chaque fois que la ligne de commande actuelle se termine avec une erreur - la valeur de retour n'est pas 0. (Si elle se terminait normalement, la valeur de retour serait évidemment 0.)

Ainsi, par exemple:

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

Alors:

$ echo foo
foo
$ false

code 1

$

(Remarque: aucun message après la echocommande qui a réussi - Qu'est-ce que cela signifie lorsque je tape une commande et que le terminal ne fait rien? )

L'astuce Arch Wiki est allée de l'avant et a colorisé le message, de sorte que vous obtenez un message jaune notable:

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

Effet:

entrez la description de l'image ici

En effet, tout ce que je dois faire est de garder un œil sur un jaune codedans la sortie pour savoir qu'une commande a échoué.

muru
la source