Dans Débuter la programmation Linux livre. Il y a une section sur Statement Block . Dans cette partie, l'explication ressemble à ce qui suit.
Blocs d'instructions
Si vous souhaitez utiliser plusieurs instructions à un endroit où une seule est autorisée, comme dans une liste AND ou OR,
vous pouvez le faire en les mettant entre accolades {} pour créer un bloc d'instructions. Par exemple, consultez le code suivant :
get_confirm && {
grep −v "$cdcatnum" $tracks_file > $temp_file
cat $temp_file > $tracks_file
echo
add_record_tracks
}
Veuillez expliquer comment le code s'exécute dans le bloc d'instructions…
Réponse acceptée :
Le code dans { ... } s'exécute exactement comme il l'aurait été sans les accolades, sauf que cela dépend maintenant du statut de sortie de get_confirm .
Si get_confirm sort avec un état de sortie nul ("succès"), le bloc s'exécute, sinon non.
C'est équivalent à
if get_confirm; then
# the contents of the block goes here
fi
(ce qui me semble plus joli)
L'exemple du livre est IMHO pas un bon exemple d'une utilisation courante de { ... } . Un meilleur exemple aurait été
{ echo 'hello world'; date; } >file
qui utilise une seule redirection pour rediriger la sortie standard des deux commandes dans le { ... } bloquer dans le même fichier.
Ceci est similaire à (et a le même effet, dans ce cas, que)
( echo 'hello world'; date ) >file
mais les instructions dans { ... } s'exécute dans le même environnement que le shell, alors que les instructions dans ( ... ) s'exécute dans un sous-shell (un environnement séparé).
Vous pouvez voir la différence avec
{ a=42; }; echo $a
et
( a=1973 ); echo $a
Le premier affichera 42 alors que le second ne sortira pas 1973 (l'affectation se produit dans un sous-shell et ne peut pas affecter l'environnement extérieur).
Remarque sur la grammaire :le } de fermeture d'un { ... } le bloc doit suivre une nouvelle ligne ou un ; . { echo 'hello' } n'est pas valide, tant que { echo 'hello'; } et
{
echo 'hello'
}
sont.