2012-08-08 37 views
6

Actualmente tengo un mensaje en bash que llama a una función para emitir el código de retorno de la última ejecución de comandos (si no es cero):

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)\$ ' 

Esto funciona bastante bien, excepto por $? no ajustados a no ser otro comando es ejecutado:

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

¿es posible restablecer/desarmar el valor de $? para el padre cáscara primera vez exit_code_prompt() se ejecuta de tal manera que no siga repetir el valor en el símbolo?

Muchas gracias, Steve.

+0

¿Por qué quieres hacer esto? Esto puede ocasionarle problemas adicionales, si desea probar algún fragmento de script manualmente sobre la línea de comando. – anishsane

Respuesta

3

El problema es que si no emite otro comando, $? no cambia. Por lo tanto, cuando se vuelva a evaluar su solicitud, está emitiendo correctamente 127. Realmente no hay una solución para esto, salvo escribir manualmente otro comando en el aviso.

de edición: En realidad he mentido, siempre hay maneras de almacenar el estado, para que pueda almacenar el valor de $? y comprobar si es cambiado y desactive el indicador de si tiene. Pero dado que estás en una subcategoría, tus opciones son bastante limitadas: tendrías que usar un archivo o algo igualmente sucio para almacenar el valor.

+1

No necesito almacenar el estado, simplemente reiniciarlo después de la impresión si no es igual a 0 --- Sé cuándo deseo hacerlo, pero no cómo (y/o si es posible) –

+0

@StephenWattam pero si no almacena estado, ¿cómo puede diferenciar entre un mensaje inmediatamente después de un comando y un mensaje * no * después de un comando? – kojiro

+0

Estaba llegando a esto desde un ángulo diferente, usando '$?' Como estado y configurándolo a cero después de una salida. –

Cuestiones relacionadas