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é.
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é.
Réponses:
Oui, il y a deux façons. L' un est de mettre PROMPT_COMMAND
en .bashrc
, l'autre - à la substitution de commandes en jeu PS1
pour 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 PS1
invite 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 PS2
invite pour les commandes multilignes). Alternativement, vous pouvez faire quelque chose comme ça (remarquez la $'...'
structure):
$> PS1=$'[ $? ] \n$> '
[ 0 ]
$>
PS1
est 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
Une méthode que j'ai choisie dans l'Archiki Wiki est de 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 ERR
interruption 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 echo
commande 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:
En effet, tout ce que je dois faire est de garder un œil sur un jaune code
dans la sortie pour savoir qu'une commande a échoué.