Risposte:
Sì, ci sono due modi. Uno è quello di impostare PROMPT_COMMAND
in .bashrc
, l'altro - per impostare la sostituzione di comando in PS1
per il echo $?
comando.
Metodo 1:
Dalla pagina del manuale di bash:
PROMPT_COMMAND
If set, the value is executed as a command prior to issuing each primary prompt.
Qualunque cosa imposti questa variabile, verrà eseguita prima di disegnare il prompt ogni volta. demo:
$> 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
$>
Nota l'uso di \$?
. Per modifiche permanenti, salvalo in.bashrc
Metodo 2
Supponiamo che il mio PS1
prompt sia impostato in questo modo:
PS1='
user@ubuntu:$> '
Se voglio eseguire qualche programma ogni volta che questo prompt viene ridisegnato sullo schermo (che è dopo ogni comando precedente eseguito), dovrei usarlo command substitution $(. . .)
e impostarlo nel prompt in questo modo:
PS1=' [ $? ]
user@ubuntu: $> '
demo:
$> PS1=' [ $? ]
> $>_ '
[ 0 ]
$>_ ls /etc/passwd > /dev/null
[ 0 ]
$>_ ls /etc/asdf > /dev/null
ls: cannot access /etc/asdf: No such file or directory
[ 2 ]
$>_
Nota che ho diviso la mia PS1 in due righe, in alto avrà [ exitcode ]
e in basso $> <blank space>'
. Questo è il motivo per cui c'è >
prima $> '
sulla seconda riga (il comando principale >
è il PS2
prompt per i comandi multilinea). In alternativa, potresti fare qualcosa del genere (nota la $'...'
struttura):
$> PS1=$'[ $? ] \n$> '
[ 0 ]
$>
PS1
è solo il testo che viene stampato prima di ottenere l'input dell'utente - niente di più. Non è immune dall'espansione dei parametri e dalle sostituzioni di comandi, quindi potresti inserire qualsiasi cosa $(...)
, per esempio, $( pwd )
e mostrerebbe lì. L'ho usato con uno script personalizzato per mostrare la carica della batteria del laptop, ad esempio
Un metodo che ho scelto da Arch Wiki è quello di trap
ERR
. trap
viene utilizzato in Bash per eseguire comandi quando viene ricevuto un segnale o per determinati altri eventi. Una ERR
trap viene eseguita ogni volta che la riga di comando corrente termina con un errore - il valore restituito non è 0. (Se terminasse normalmente, il valore restituito sarebbe ovviamente 0.)
Quindi, per esempio:
trap 'printf "\ncode %d\n\n" $?' ERR
Poi:
$ echo foo
foo
$ false
code 1
$
(Nota: nessun messaggio dopo il echo
comando eseguito correttamente - Cosa significa quando si digita un comando e il terminale non fa nulla? )
Il suggerimento di Arch Wiki è andato avanti e ha colorato il messaggio, in modo da ottenere un messaggio giallo evidente:
EC() { echo -e '\e[1;33m'code $?'\e[m\n'; }
trap EC ERR
Effetto:
In effetti, tutto ciò che devo fare è tenere d'occhio un giallo code
nell'output per sapere se un comando non è riuscito.