2012-08-08 8 views
6

Attualmente ho una richiesta in bash che chiama una funzione per l'uscita del codice di ritorno dell'ultimo comando eseguito (se non zero):

exit_code_prompt() 
{ 
    local exit_code=$? 
    if [ $exit_code -ne 0 ] 
    then 
     tput setaf 1 
     printf "%s" $exit_code 
     tput sgr0 
    fi 
} 


PS1='$(exit_code_prompt)\$ ' 

Questo funziona piuttosto bene, tranne per $? non reset meno che un altro comando è gestito:

$ echo "works" 
works 
$ command_not_found 
bash: command_not_found: command not found 
127$ 
127$ 
127$ 
127$ echo "works" 
works 
$ 

E 'possibile ripristinare/disinserire il valore della $? per il genitore shell la prima volta exit_code_prompt() viene eseguito in modo tale che essa non continui a ripetere il valore nel prompt?

Mille grazie, Steve.

+0

Perché vuoi farlo? Ciò potrebbe causare ulteriori problemi se si desidera testare manualmente alcuni snippet di script tramite la riga di comando. – anishsane

risposta

3

Il problema è che se non si invia un altro comando, $? non sta cambiando. Quindi, quando il tuo prompt viene rivalutato, emette correttamente 127. Non c'è davvero una soluzione alternativa per questo tranne digitare manualmente un altro comando al prompt.

Edit: In realtà ho mentito, ci sono sempre modi per memorizzare lo stato, in modo da poter memorizzare il valore di $? e verificare se è cambiato e deselezionare la richiesta se ha. Ma dal momento che sei in una subshell, le tue opzioni sono piuttosto limitate: dovresti usare un file o qualcosa di altrettanto sporco per memorizzare il valore.

+1

Non è necessario memorizzare lo stato, è sufficiente ripristinarlo dopo il printf se non è uguale a 0 --- so quando desidero farlo, ma non solo come (e/o se è possibile) –

+0

@StephenWattam, ma se non memorizzi lo stato, come puoi dire la differenza tra un prompt che segue immediatamente un comando e un prompt * non * che segue un comando? – kojiro

+0

Stavo arrivando da un angolo diverso, usando '$?' Come stato e impostandolo su zero dopo un output. –

Problemi correlati