2011-05-12 25 views
9

tengo la siguiente secuencia de comandos y quiero que la secuencia de comandos para detener la ejecución de la línea x línea x si encuentra un error, ¿cómo puedo hacer eso?shell script de error de detención

 
pvcreate /dev/$1 
vgextend VolGroup00 /dev/$1 
lvextend --size +$2 /dev/VolGroup00/LogVol00 
resize2fs /dev/VolGroup00/LogVol00 

Respuesta

9

Debe utilizar set -e en algún lugar antes de ejecutar esta pieza.

12

Añadir lo siguiente a la parte superior.

set -e 

Después de ejecutar esa línea, el shell se cerrará si alguna línea devuelve un código de error. set +e lo desactivará de nuevo (es decir, volverá a continuar independientemente de cualquier código de retorno de error).

Consulte http://www.davidpashley.com/articles/writing-robust-shell-scripts.html para obtener más información.

1

Deberá consultar cada paso para verificar su código de retorno. Esto significa que deberá comprender cuáles son los códigos de retorno para cada consulta (podría ser diferente para cada consulta). El siguiente ejemplo verifica vgextend para el código de error -1, luego devuelve -1.

pvcreate /dev/$1 
vgextend VolGroup00 /dev/$1 

if [ $? == -1 ]; then 
     echo "vgextend returned an error" 
     exit -1; 
fi 

lvextend --size +$2 /dev/VolGroup00/LogVol00 
resize2fs /dev/VolGroup00/LogVol00 

Conjunto -puede ser exagerado, ya que algunos errores pueden ser tolerables bajo ciertas circunstancias. En el ejemplo a continuación, el rm devolverá un error si el archivo no existe, pero está bien continuar (Sí, sé que podríamos eliminarlo condicionalmente, pero el ejemplo está destinado a ilustrar el punto que se está creando)

# delete the file, it it exists 
rm thefile 
# create the file 
touch thefile 
+0

yo aconsejaría a marcar estos comandos probable para quebrar por separado, como 'rm somefile || cierto'. En este caso, 'set -e' no se disparará. –