misuse - Bash/sh-diferencia entre && y;
exitcode (7)
&& es lógico Y en bash. Bash tiene una evaluación de cortocircuito de Y lógico. Este idioma es una forma más simple de expresar lo siguiente:
cmd1;rc=$?
if [ $rc -eq 0 ]; then
cmd2
fi
Mientras que el ; la versión es simplemente:
cmd1
cmd2
Yo normalmente uso ;
para combinar más de un comando en una línea, pero algunas personas prefieren &&
. Hay alguna diferencia? Por ejemplo, cd ~; cd -
cd ~; cd -
y cd ~ && cd -
parece hacer lo mismo. ¿Qué versión es más portátil, por ejemplo, será compatible con un bash-subconjunto como el caparazón de Android más o menos?
Comandos separados por ;
se ejecutan secuencialmente independientemente de su estado de finalización.
Con &&
, el segundo comando se ejecuta solo si el primero se completa con éxito (devuelve el estado de salida de 0).
Esto se trata en la página de manual de bash en Lists
. Esperaría que cualquier shell tipo Unix sea compatible con estos dos operadores, pero no sé específicamente sobre el shell de Android.
En cmd1 && cmd2
, cmd2
solo se ejecuta si cmd1
tiene éxito (devuelve 0).
En cmd1 ; cmd2
cmd1 ; cmd2
, cmd2
se ejecuta en cualquier caso.
Ambas construcciones son parte de un shell que cumple con POSIX.
Estoy usando &&
porque hace mucho tiempo en la computadora cercana:
root# pwd
/
root# cd /tnp/test; rm -rf *
cd: /tnp/test: No such file or directory
...
... and after a while ...
...
^C
pero no ayudó ...;)
cd /tnp/test && rm -rf *
es seguro ...;)
Si el comando anterior falló con ;
el segundo se ejecutará.
Pero con &&
el segundo no se ejecutará.
Este es un operando "AND" lógico "flojo" entre operaciones.
&&
permite la ejecución condicional while ;
siempre tiene el segundo comando ejecutándose.
En, por ejemplo, command1 && command2
, command2
solo se ejecutará cuando command1
haya terminado con exit 0
, la señalización todo salió bien, mientras que en command1 ; command2
command1 ; command2
el segundo comando siempre se ejecutará sin importar el resultado de command1
.
&&
significa ejecutar el siguiente comando si el anterior salió con el estado 0. Por el contrario, use ||
es decir, que se ejecutará si el comando anterior sale con un estado no igual a 0 ;
ejecuta siempre.
Muy útil cuando necesita realizar una acción particular dependiendo de si el comando anterior terminó bien o no.