2010-03-31 29 views
6

escribí un pequeño script de Bash para encontrar todos los conjuntos de cambios mercuriales (a partir de la punta) que contiene la cadena que se pasa en el argumento:Bash: ¿cómo interrumpir este script cuando hay un CTRL-C?

#!/bin/bash 

CNT=$(hg tip | awk '{ print $2 }' | head -c 3) 
while [ $CNT -gt 0 ] 
do 
    echo rev $CNT 
    hg log -v -r$CNT | grep $1  
    let CNT=CNT-1 
done 

Si interrumpirlo pulsando Ctrl-C, más a menudo que no es el El comando actualmente ejecutado es "hg log" y es ese comando el que se interrumpe, pero luego mi script continúa.

entonces yo estaba pensando en comprobar el estado de retorno de "hg log", sino porque estoy tubería en grep No estoy muy seguro de cómo ir sobre él ...

¿Cómo debe Voy a salir de este script cuando se interrumpe? (por cierto, no sé si esa secuencia de comandos es buena para lo que quiero hacer, pero funciona y, de todos modos, estoy interesado en el problema "interrumpido")

Respuesta

5

reescribir su guión como este, usando la matriz $ PIPESTATUS para comprobar si hay un fallo:

#!/bin/bash 

CNT=$(hg tip | awk '{ print $2 }' | head -c 3) 
while [ $CNT -gt 0 ] 
do 
    echo rev $CNT 
    hg log -v -r$CNT | grep $1 
    if [ 0 -ne ${PIPESTATUS[0]} ] ; then 
      echo hg failed 
      exit 
    fi  
    let CNT=CNT-1 
done 
+0

Muchas gracias, +1 a todos. Funcionando bien :) – SyntaxT3rr0r

+0

Probablemente debería señalar que tanto $ PIPESTATUS como la opción pipefail que Arkku mencionó son Bash versión 3+ específica. No son compatibles con otras conchas. –

+0

gracias, en mi Debian Linuxes, sí tengo Bash 3+, pero en mi Mac es Bash 2.05. – SyntaxT3rr0r

1

La variable $PIPESTATUS le permitirá verificar los resultados de cada miembro de la tubería.

6

lugar al comienzo de su script: trap 'echo interrupted; exit' INT

Editar: Como se señaló en los comentarios a continuación, probablemente no funciona para el programa de la OP debido a la tubería. La solución $PIPESTATUS funciona, pero podría ser más sencillo de instalar la secuencia de comandos para salir si hay algún programa en las salidas de tubo con un estado de error: set -e -o pipefail

+0

El comando de captura solo funciona con procesos que no atrapan las interrupciones. Si el script recibía la interrupción, ya estaría cancelando. –

+0

Ah, lo siento, olvidé la tubería en el guión del OP. Una mejor respuesta podría ser: establecer -e pipefail – Arkku

+0

Su primera solución (la trampa) funcionaría con cualquier proceso que no atrape las interrupciones por sí mismo - * find * es un buen ejemplo de un proceso de larga duración que lo hará pasar a través de la interrupción, provocando que la secuencia de comandos aborte. La trampa se puede utilizar para evitar que la secuencia de comandos se anule de inmediato para realizar una limpieza, como un destructor o un finalizador. Es un comando útil de saber. –

Cuestiones relacionadas