Risposte:
Sì, ci sono due modi. Uno è quello di impostare PROMPT_COMMANDin .bashrc, l'altro - per impostare la sostituzione di comando in PS1per 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 PS1prompt 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 PS2prompt 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. trapviene utilizzato in Bash per eseguire comandi quando viene ricevuto un segnale o per determinati altri eventi. Una ERRtrap 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 echocomando 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 codenell'output per sapere se un comando non è riuscito.