línea de comandos: ¿para qué sirve &&
?
Concha, cuando veas
$ command one && command two
la intención es ejecutar el comando que sigue al &&
único si el primer comando es exitoso. Esto es idiomático de los proyectiles Posix, y no solo se encuentra en Bash.
Tiene la intención de evitar la ejecución del segundo proceso si el primero falla.
Puede notar que he usado la palabra "intención", eso es por una buena razón. No todos los programas tienen el mismo comportamiento, por lo que para que esto funcione, debe comprender lo que el programa considera un "error" y cómo lo maneja leyendo la documentación y, si es necesario, el código fuente.
Su shell considera un valor de retorno de 0 para verdadero, otros números positivos para falso
Los programas devuelven una señal al salir. Deberían devolver 0 si salen con éxito, o mayor que cero si no lo hacen. Esto permite una cantidad limitada de comunicación entre procesos.
Se &&
hace referencia a esto como AND_IF
en la gramática de shell posix , que forma parte de una and_or
lista de comandos, que también incluye el ||
cual es OR_IF
con una semántica similar.
Símbolos gramaticales, citados de la documentación:
%token AND_IF OR_IF DSEMI
/* '&&' '||' ';;' */
Y la Gramática (también citada de la documentación), que muestra que cualquier número de AND_IF
s ( &&
) y / o OR_IF
s ( ||
) se pueden unir (como and_or
se define de forma recursiva):
and_or : pipeline
| and_or AND_IF linebreak pipeline
| and_or OR_IF linebreak pipeline
Ambos operadores tienen la misma precedencia y se evalúan de izquierda a derecha (se dejan asociativos). Como dicen los documentos:
Una AND-OR
lista es una secuencia de una o más tuberías separadas por los operadores "&&"
y "||"
.
Una lista es una secuencia de uno o más y-OR listas separadas por los operadores ';'
y '&'
y opcionalmente terminado con ';'
, '&'
o.
Los operadores "&&"
y "||"
tendrán la misma precedencia y se evaluarán con asociatividad izquierda. Por ejemplo, los dos comandos siguientes escriben únicamente barra en la salida estándar:
$ false && echo foo || echo bar
$ true || echo foo && echo bar
En el primer caso, el falso es un comando que sale con el estado de 1
$ false
$ echo $?
1
lo que significa echo foo
que no se ejecuta (es decir, cortocircuito echo foo
). Entonces echo bar
se ejecuta el comando .
En el segundo caso, salidas verdaderas con un código de 0
$ true
$ echo $?
0
y por echo foo
lo tanto no se ejecuta, luego echo bar
se ejecuta.
false && echo "Will not be printed"
.