Stampa il valore restituito dopo l'esecuzione del programma


9

Mi chiedo come impostare l'opzione per la stampa automatica del valore di ritorno dopo ogni esecuzione del programma nel terminale senza digitare echo $?.

È qualcosa che può essere impostato? Codeblocks ha questa caratteristica.

Risposte:


10

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 ] 
$> 

+1 Funziona davvero. Non sto dubitando di qualcuno con una reputazione di 27k, ma apparentemente il prompt non è un "comando", quindi usando $? in esso non si ottiene $? resettare a zero come pensavo potesse essere - anche usando il primo metodo che esegue l'eco senza errori.
Joe

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
Sergiy Kolodyazhnyy

@mchid cosa intendi?
Sergiy Kolodyazhnyy

1
@mchid "Prima di emettere ogni prompt primario", quindi dopo che l'ultimo comando ha terminato l'esecuzione.
kos

1
@mchid viene eseguito prima della stampa del prompt, quindi prima di digitare il comando successivo.
Muru

4

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:

inserisci qui la descrizione dell'immagine

In effetti, tutto ciò che devo fare è tenere d'occhio un giallo codenell'output per sapere se un comando non è riuscito.

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.