En Principios de la programación de Linux libro. Hay una sección sobre Bloqueo de declaraciones . En esa Porción, la explicación es similar a la siguiente.
Bloques de declaraciones
Si desea utilizar varias declaraciones en un lugar donde solo se permite una, como en una lista AND u OR,
puede hacerlo encerrándolas entre llaves {} para crear un bloque de declaraciones. Por ejemplo, vea el siguiente código:
get_confirm && {
grep −v "$cdcatnum" $tracks_file > $temp_file
cat $temp_file > $tracks_file
echo
add_record_tracks
}
Explique cómo se ejecuta el código en el bloque de instrucciones...
Respuesta aceptada:
El código dentro de { ... }
ejecutar exactamente de la forma en que se habría ejecutado sin las llaves, excepto que ahora depende del estado de salida de get_confirm
.
Si get_confirm
sale con un estado de salida cero ("éxito"), el bloque se ejecuta, de lo contrario no.
Es equivalente a
if get_confirm; then
# the contents of the block goes here
fi
(que creo que se ve mejor)
En mi humilde opinión, el ejemplo del libro no es un buen ejemplo de un uso común de { ... }
. Un mejor ejemplo hubiera sido
{ echo 'hello world'; date; } >file
que utiliza una sola redirección para redirigir la salida estándar de ambos comandos en el { ... }
bloque al mismo archivo.
Esto es similar a (y tiene el mismo efecto, en este caso, que)
( echo 'hello world'; date ) >file
pero las declaraciones dentro de { ... }
se ejecuta en el mismo entorno que el shell, mientras que las sentencias en ( ... )
se ejecuta en una subcapa (un entorno separado).
Puedes ver la diferencia con
{ a=42; }; echo $a
y
( a=1973 ); echo $a
El primero generará 42
mientras que el segundo no generará 1973
(la asignación ocurre en una subcapa y no puede afectar el entorno exterior).
Aviso sobre gramática:el }
de cierre de un { ... }
el bloque debe seguir una nueva línea o un ;
. { echo 'hello' }
no es válido, mientras que ambos { echo 'hello'; }
y
{
echo 'hello'
}
son.