En bash
, a veces quiero ejecutar varios comandos en serie y no quiero esperar a que terminen antes de escribir los nuevos. Entonces hago algo como esto:
cmd1; cmd2; cmd3
Desafortunadamente, uno de los comandos puede fallar. En ese caso, me gustaría parar. ¿Hay una manera fácil de hacer esto, pero hacer que solo siga ejecutando los comandos si el comando anterior tenía un código de salida 0?
command-line
bash
metáfora pitónica
fuente
fuente
Respuestas:
Usar
&&
operador,En shellscripting,
&&
y los||
operadores se modelan después de la implementación optimizada de operadores lógicos en C.&&
significa operador AND, y||
significa OR. Unix está estrechamente relacionado con C, y en C, el segundo operando de operadores lógicos no se evalúa si el resultado ya se conoce del primer operando. Por ejemplo,"false && x"
esfalse
para cualquierx
, por lo que no hay necesidad de evaluarx
(especialmente si sex
trata de una llamada de función); igualmente para"true || x"
. Esto también se llama semántica de cortocircuito .Y en Unix, es tradicional interpretar los valores de retorno de los comandos como valores de verdad de "finalización exitosa": el código de salida 0 significa
true
(éxito), no cero significafalse
(falla). Entonces, cuando el primer comando encmd1 && cmd2
retorna"false"
(estado de salida distinto de cero, que indica falla), se conoce el estado del comando compuesto: falla. Entonces, la interpretación general decmd1 && cmd2
puede ser: "ejecutarcmd1
, Y ENTONCES, si no fallacmd2
". Que es lo que básicamente quieres en tu pregunta.De manera similar con OR:
cmd1 || cmd2
puede interpretarse como "ejecutarcmd1
, O SI fallacmd2
".Protip: para cadenas más largas de
&&
, considere ponerset -e
en su script. Básicamente cambia el punto;
y coma en&&
, con un par de casos especiales.fuente
||
A || B
es lo mismo que el [cortocircuitando] lógica AOB .A || B
es el éxito cuandoA
fue éxito o cuandoA
fue fracaso peroB
fue éxito ; yA || B
es fracaso cuandoA
era fracaso yB
fuefailure
. Del mismo modo&&
, sigue lógicamente AND.;
(o nueva línea) por defecto.set -e
se convertirá;
en&&
, más o menos hablando.set +e
[el valor predeterminado] se convierteA; B
en lo que usted dice: ejecutarA
, luego no importa qué ejecuteB
."Encadenando Comandos y Agrupándolos"
pings, solo si no tiene éxito, ejecuta el grupo encadenado de comandos entre paréntesis.
Atención:
La lista debe terminarse con un ";".
¡Debe haber espacios en blanco entre paréntesis y los comandos agrupados!
fuente
Simplemente con el
&&
operador. Por ejemplo:Si uno de los comandos falla (devuelve un valor de salida distinto de 0), los otros comandos no se ejecutarán.
fuente