Come configurare bash per stampare lo stato di uscita per ogni comando?


12

Ogni comando eseguito in bash ritorna con un codice di uscita.

Ogni volta che digito un comando sul prompt di bash, voglio che mostri lo stato di uscita, ovvero echo $?

ad esempio, se corro echo "hello";sul prompt di bash, l'output dovrebbe essere:

linux@linux$ hello
linux@linux$ 0

Che ne dici di pubblicare la tua domanda su unix.stackexchange.com ?

Grazie @Frank. Ma non è anche un buon posto per porre questa domanda?
Ravidixit,

Ho provato a stamparlo come parte della variabile PS1, ma non funziona per motivi che ancora non capisco.
Ravidixit,

Risposte:


13

Il codice di uscita dall'ultimo comando eseguito è memorizzato nella $?variabile d'ambiente. Quindi puoi semplicemente aggiungere questa variabile al prompt dei comandi predefinito e avrai sempre il codice di uscita stampato lì. Il prompt è memorizzato nella $PS1variabile d'ambiente. Inizialmente è impostato nello /etc/bash.bashrcscript e successivamente in $HOME/.bashrc.

Quindi modifica la riga in $HOME/.bashrc( /etc/bash.bashrcsarebbe a livello di sistema) dal suo valore predefinito:

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

a questo (ad esempio):

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

Quindi il prompt predefinito è cambiato in:

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

Lo 0 tra parentesi è il tuo codice di uscita, vedi:

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

Per i significati consultare http://www.tldp.org/LDP/abs/html/exitcodes.html


Ho provato a farlo, ma per il bash a portata di mano, non funziona. mostra sempre [0] per la macchina su cui sto lavorando.
Ravidixit,

Sei sicuro di eseguire una festa? Puoi copiare l'output di per readlink /proc/$$/exefavore? 0 significa nessun errore, hai provato qualcosa che dà un errore: ^Coppure falseoppure asdasdasd?
caos,

1
@chaos Ho la mia PS1 come PS1=$(printf "%s\\\\u@\h:%s%s\w[$?]$%s " "$yellow" "$end" "$blue" "$end"), ma mostra 0sempre. Qualche idea sul perché?
Max

1
Sarebbe bello se lo stato di uscita fosse mostrato solo, se non è uguale a 0
rubo77

1
@max È perché il tuo $?è già espanso 0quando si imposta il tuo PS1. Fai echo $PS1e vedrai. Devi usare le virgolette singole o scappare come \$?.
Wisbucky

7

Un altro modo che ho scelto da Arch Wiki era di usare trap:

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

Effetto:

$ ( exit 1 )
code 1

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

$

2
Ciò non soddisfa pienamente i requisiti del PO, dal momento che vuole stampare lo stato di uscita anche se è zero, ma è esattamente quello che stavo cercando.
Keith Thompson,

2

Qui c'è un semplice esempio:

PS1='$? > '

Se si utilizzano virgolette doppie, è necessario aggiungere una barra rovesciata per evitare $:

PS1="\$? > "

Produzione:

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

Un modo ancora migliore è stampare il codice di uscita solo quando è diverso da zero.

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

Uscita campione:

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

Spiegazione: ${var#pattern}è un'espansione del parametro bash che significa rimuovere il modello di corrispondenza più breve dalla parte anteriore di $ var. Quindi, in questo caso, stiamo rimuovendo 0dalla parte anteriore di $?, che troncerebbe effettivamente un codice di uscita di 0.

Se si utilizzano virgolette doppie, $?verrebbero sostituite quando PS1è impostato, anziché essere valutate ogni volta. Fare echo $PS1per confermare non si dispone di un valore hardcoded in PS1.


Grazie da gennaio 2018. Voglio il prompt normale con il codice di uscita all'inizio se è diverso da zero - questo aiuta molto.
SDsolar,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.