Configura bash per stampare lo stato di uscita di ogni comando immesso

Ogni comando che digito su bash restituisce un codice di uscita.

Voglio:
Ogni volta che digito un comando sul prompt di bash, voglio che esca e stampi exit status ie echo $? .

ad es. se eseguo echo "hello"; sul prompt di bash, l’output dovrebbe essere:

 [email protected]$ hello [email protected]$ 0 

Il codice di uscita dall’ultimo comando eseguito è memorizzato in $? variabile d’ambiente. Quindi è sufficiente aggiungere questa variabile al prompt dei comandi predefinito e verrà sempre stampato il codice di uscita. Il prompt è memorizzato nella variabile di ambiente $PS1 . Inizialmente è impostato nello script /etc/bash.bashrc e successivamente in $HOME/.bashrc .

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

 PS1='${debian_chroot:+($debian_chroot)}\[email protected]\h:\w\$ ' 

a questo (per esempio):

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

Quindi il prompt predefinito è cambiato in:

 [email protected]:/path/to/dir[0] $ 

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

 [email protected]:~[0] $ ls [email protected]:~[0] $ ls /root/ ls: cannot open directory /root/: Permission denied [email protected]:~[2] $ ^C [email protected]:~[130] $ 

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

Un altro modo che ho scelto da Arch Wiki era usare la 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 $ 

Qui c’è un semplice esempio:

 PS1='$? > ' 

Se usi le virgolette doppie, devi aggiungere una barra rovesciata per evitare il $ :

 PS1="\$? > " 

Produzione:

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

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

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

Uscita di esempio:

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

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

Se si usano le virgolette doppie, $? sarebbe sostituito quando PS1 è impostato, invece di essere valutato ogni volta. Fai echo $PS1 per confermare che non hai un valore codificato in PS1 .