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.