Comment configurer bash pour imprimer l'état de sortie pour chaque commande?


12

Chaque commande exécutée dans bash renvoie un code de sortie.

Chaque fois que je tape une commande à l'invite bash, je veux qu'elle affiche l'état de sortie, c'est-à-dire, echo $?

par exemple, si je lance echo "hello";sur l'invite bash, la sortie devrait être:

linux@linux$ hello
linux@linux$ 0

Et si vous posiez votre question sur unix.stackexchange.com ?

Merci @Frank. Mais n'est-ce pas aussi un bon endroit pour poser cette question?
ravidixit

J'ai essayé de l'imprimer en tant que partie de la variable PS1, mais ne fonctionne pas pour des raisons que je ne comprends pas encore.
ravidixit

Réponses:


13

Le code de sortie de la dernière commande exécutée est stocké dans la $?variable d'environnement. Vous pouvez donc simplement ajouter cette variable à l'invite de commande par défaut et vous aurez toujours le code de sortie imprimé là-bas. L'invite est stockée dans la $PS1variable d'environnement. Il est initialement défini dans le /etc/bash.bashrcscript et plus tard dans le $HOME/.bashrc.

Modifiez donc la ligne $HOME/.bashrc( /etc/bash.bashrcserait à l'échelle du système) à partir de sa valeur par défaut:

PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '

à cela (par exemple):

PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w[$?] \$ '

Ainsi, l'invite par défaut est devenue:

user@host:/path/to/dir[0] $

Le 0 entre parenthèses est votre code de sortie, voir:

user@host:~[0] $ ls
user@host:~[0] $ ls /root/
ls: cannot open directory /root/: Permission denied
user@host:~[2] $ ^C
user@host:~[130] $

Pour les significations, voir http://www.tldp.org/LDP/abs/html/exitcodes.html


J'ai essayé de le faire mais pour le bash à portée de main, ça ne fonctionne pas. il affiche toujours [0] pour la machine sur laquelle je travaille.
ravidixit

Êtes-vous sûr que vous exécutez un bash? Pouvez-vous copier la sortie de readlink /proc/$$/exes'il vous plaît? 0 signifie aucune erreur, avez-vous essayé quelque chose qui donne une erreur: ^Cou falseou asdasdasd?
chaos

1
@chaos J'ai ma PS1 en tant que PS1=$(printf "%s\\\\u@\h:%s%s\w[$?]$%s " "$yellow" "$end" "$blue" "$end"), mais ça se voit 0tout le temps. Une idée pourquoi?
Max

1
Ce serait bien, si le statut de sortie n'était affiché que s'il était inégal 0
rubo77

1
@max C'est parce que votre $?est déjà développé 0lors de la configuration de votre PS1. Faites echo $PS1et vous verrez. Vous devez soit utiliser des guillemets simples, soit y échapper comme \$?.
wisbucky

7

Une autre façon que j'ai choisie dans Arch Wiki était d'utiliser trap:

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

Effet:

$ ( exit 1 )
code 1

$ some-non-existent-command
some-non-existent-command: command not found
code 127

$

2
Cela ne répond pas tout à fait aux exigences de l'OP, car il veut imprimer le statut de sortie même s'il est nul - mais c'est exactement ce que je cherchais.
Keith Thompson

2

Voici un exemple simple:

PS1='$? > '

Si vous utilisez des guillemets doubles, vous devez ajouter une barre oblique inverse pour échapper à $:

PS1="\$? > "

Production:

0 > echo 'ok'
ok
0 > bogus
bogus: command not found
127 > 

Une façon encore meilleure consiste à imprimer le code de sortie uniquement lorsqu'il est différent de zéro.

PS1='${?#0}> '    # single quote example
PS1="\${?#0}> "   # double quote example (requires extra backslash)

Exemple de sortie:

> echo 'ok'
ok
> bogus
bogus: command not found
127> 

Explication: ${var#pattern}est une extension de paramètre bash qui signifie supprimer le modèle de correspondance le plus court à l'avant de $ var. Donc, dans ce cas, nous supprimons 0de l'avant $?, ce qui tronquerait effectivement un code de sortie de 0.

Si vous utilisez des guillemets doubles, $?serait substitué lorsque PS1est défini, au lieu d'être évalué à chaque fois. Faites echo $PS1pour confirmer que vous n'avez pas de valeur codée en dur dans PS1.


Merci de janvier 2018. Je veux l'invite normale avec le code de sortie au début s'il est différent de zéro - cela aide beaucoup.
SDsolar
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.