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_IFen la gramática de shell posix , que forma parte de una and_orlista de comandos, que también incluye el ||cual es OR_IFcon 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_IFs ( &&) y / o OR_IFs ( ||) se pueden unir (como and_orse 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-ORlista 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 fooque no se ejecuta (es decir, cortocircuito echo foo). Entonces echo barse ejecuta el comando .
En el segundo caso, salidas verdaderas con un código de 0
$ true
$ echo $?
0
y por echo foolo tanto no se ejecuta, luego echo barse ejecuta.
false && echo "Will not be printed".