2012-06-27 23 views
252

Estoy utilizando siguientes opcionesBash error al ignorar por un comando en particular

set -o pipefail 
set -e 

En escritura del golpe para detener la ejecución en caso de error. Tengo 100 de ejecución de script y no quiero verificar el código de retorno del script. Pero para una secuencia de comandos particular, quiero ignorar el error. Cómo puedo hacer eso ?

Respuesta

417

La solución:

particular_script || true 

Ejemplo:

$ cat /tmp/1.sh 
particular_script() 
{ 
    false 
} 

set -e 

echo ein 
particular_script || true 
echo zwei 
particular_script 
echo drei 

$ bash /tmp/1.sh 
ein 
zwei 

drei será nunca se imprime.

Además, quiero añadir que cuando pipefail está en, es suficiente para la cáscara de pensar que toda la tubería tiene un código de salida distinto de cero cuando uno de los comandos de la tubería tiene un código de salida distinto de cero (con pipefail debe ser el último).

$ set -o pipefail 
$ false | true ; echo $? 
1 
$ set +o pipefail 
$ false | true ; echo $? 
0 
+7

+1. Como el Manual de referencia de Bash [explica] (http://www.gnu.org/software/bash/manual/bashref.html#The- Set-Builtin), "El shell no sale" cuando el atributo '-e' se establece "si el comando que falla es parte de la lista de comandos inmediatamente después de una palabra clave' while' o 'until', parte de la prueba en una instrucción' if', parte de cualquier comando ejecutado en '&&' o '| | lista excepto el comando que sigue al final '&&' o '||', cualquier comando en una canalización pero el último, o si el estado de retorno del comando se está invirtiendo con '!'." – ruakh

+0

@ruakh: Así es –

+0

@IgorChubin No sé por qué, pero esto no funciona output =' (ldd $ 2/bin/* || true) | grep "no encontrado" | wc -l' la secuencia de comandos está terminando después de esta línea cuando ldd return failure –

102

Simplemente agregue || true después del comando donde desea ignorar el error.

+4

Creo que es importante agregar esto: este método permitirá que persistan el código de respuesta y el mensaje de error, mientras que el "!" El método descrito a continuación cambiará el código de respuesta y, por lo tanto, no generará el error. Esto es importante cuando se utiliza 'set -e' y se intenta capturar un mensaje de error: por ejemplo, 'set -e; PRUEBA = $ (foo 2> & 1 || verdadero); echo $ TEST' – Spanky

35

más concisa:

! particular_script 

Desde el POSIX specification respecto set -e (el énfasis es mío):

Cuando esta opción está activada, si un simple comando falla por alguna de las razones enumeradas en Consecuencias de Shell Errors o devuelve un valor de estado de salida> 0 y no forma parte de la lista compuesta después de un tiempo, hasta que, o si es una palabra clave, y no es parte de una lista AND o O, y no es una tubería precedida por el ! palabra reservada, entonces el caparazón deberá salir inmediatamente.

+6

Esto simplemente invierte el código de salida de un comando, por lo que el comando que finalizó correctamente devolverá 1 en lugar de 0 y el script de error con '-e'. – Marboni

+6

Según tengo entendido, el '!' Evitará que el shell salga, pase lo que pase. [Este script] (http://pastebin.com/B6aRXGeA) muestra el mensaje '¡Todavía con vida!' Cuando lo ejecuto, lo que indica que el script se ejecutó por completo. ¿Estás viendo un comportamiento diferente? –

+5

tiene razón, invierte el estado de la salida, pero no bloquea la secuencia de comandos cuando el comando termina con 0 o 1. No presté atención. De todos modos, gracias por citar la documentación, puse mi expresión en la cláusula 'if' y resolví el problema. – Marboni

18

En lugar de "volver verdadero", también se puede utilizar el "NOOP" o utilidad nula (como se indica en el POSIX specs) : y simplemente "no hacer nada". Guardará algunas letras. :)

#!/usr/bin/env bash 
set -e 
man nonexistentghing || : 
echo "It's ok.." 
+18

Incluso puedes quitar el espacio para convertirlo en un bonito emoticón ||: – Sunny

+9

Divertido porque ese es el emoticón que le doy a las personas cuando ignoran los códigos de error ... – thedayturns

10

Sólo en caso de si desea que su guión no se detenga si un comando en particular falla y también quieren guardar el código de error del comando ha fallado:

código

set -e; 
command || EXIT_CODE=$? && true ; 
echo $EXIT_CODE 
Cuestiones relacionadas