¿Cuál es el propósito de "&&" en un comando de shell?
Hasta donde yo sé, usarlo &
después del comando es para ejecutarlo en segundo plano.
Ejemplo de &
uso:tar -czf file.tar.gz dirname &
¿Pero qué tal &&
? ( ejemplo )
Además, también tienes ||
cuál es el lógico o, y también ;
cuál es solo un separador al que no le importa lo que pasó con el comando antes.
$ false || echo "Oops, fail"
Oops, fail
$ true || echo "Will not be printed"
$
$ true && echo "Things went well"
Things went well
$ false && echo "Will not be printed"
$
$ false ; echo "This will always run"
This will always run
Algunos detalles sobre esto se pueden encontrar aquí Listas de comandos en el manual de Bash.
&&
le permite hacer algo en función de si el comando anterior se completó correctamente; es por eso que tiende a verlo encadenado como do_something && do_something_else_that_depended_on_something
.
Línea de comando: ¿cuál es el propósito de
&&
?
En concha, cuando ves
$ command one && command two
la intención es ejecutar el comando que sigue al &&
solo si el primer comando tiene éxito. Esto es idiomático de los shells Posix y no solo se encuentra en Bash.
Pretende impedir la ejecución del segundo proceso si el primero falla.
Quizás hayas notado que he usado la palabra "intención", y es por una buena razón. No todos los programas tienen el mismo comportamiento, por lo que para que esto funcione, es necesario comprender qué considera el programa un "fallo" 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 AND_IF
en la gramática del shell posix , que es parte de una and_or
lista de comandos, que también incluye el ||
con OR_IF
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 (son asociativos por izquierda). Como dicen los médicos:
Una
AND-OR
lista es una secuencia de uno o más canales separados por los operadores"&&"
y"||"
.Una lista es una secuencia de una o más listas AND-OR separadas por operadores
';'
y'&'
opcionalmente terminadas por';'
,'&'
o .Los operadores
"&&"
y"||"
tendrán igual precedencia y serán evaluados 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 false es un comando que sale con el estado de
1
$ false $ echo $? 1
lo que significa
echo foo
que no funciona (es decir, que está en cortocircuitoecho foo
).echo bar
Luego se ejecuta el comando .En el segundo caso, verdadero sale con un código de
0
$ true $ echo $? 0
y por tanto
echo foo
no se ejecuta, entoncesecho bar
se ejecuta.