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é.
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 ]
$>
Une méthode que j'ai choisie the Arch Wiki consiste à trap
ERR
. 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:
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é.