In Inizio della programmazione Linux prenotare. C'è una sezione su Blocco dichiarazioni . In quella parte la spiegazione è simile alla seguente.
Blocchi di istruzioni
Se desideri utilizzare più istruzioni in una posizione in cui solo una è consentita, ad esempio in un elenco AND o OR,
puoi farlo racchiudendole tra parentesi graffe {} per creare un blocco di istruzioni. Ad esempio, vedere il codice seguente:
get_confirm && {
grep −v "$cdcatnum" $tracks_file > $temp_file
cat $temp_file > $tracks_file
echo
add_record_tracks
}
Spiega come viene eseguito il codice nel blocco istruzioni...
Risposta accettata:
Il codice all'interno di { ... }
esegui esattamente come sarebbe stato eseguito senza le parentesi graffe, tranne che ora dipende dallo stato di uscita di get_confirm
.
Se get_confirm
esce con stato di uscita zero (“successo”), il blocco viene eseguito, altrimenti no.
È equivalente a
if get_confirm; then
# the contents of the block goes here
fi
(che penso sia più carino)
L'esempio del libro è IMHO non un buon esempio di un uso comune di { ... }
. Un esempio migliore sarebbe stato
{ echo 'hello world'; date; } >file
che utilizza un unico reindirizzamento per reindirizzare l'output standard di entrambi i comandi nel { ... }
blocco sullo stesso file.
È simile a (e ha lo stesso effetto, in questo caso, di)
( echo 'hello world'; date ) >file
ma le istruzioni all'interno di { ... }
viene eseguito nello stesso ambiente della shell, mentre le istruzioni in ( ... )
viene eseguito in una subshell (un ambiente separato).
Puoi vedere la differenza con
{ a=42; }; echo $a
e
( a=1973 ); echo $a
Il primo produrrà 42
mentre il secondo non produrrà 1973
(l'assegnazione avviene in una subshell e non può influire sull'ambiente esterno).
Avviso sulla grammatica:la chiusura }
di un { ... }
il blocco deve seguire una nuova riga o un ;
. { echo 'hello' }
non è valido, mentre entrambi { echo 'hello'; }
e
{
echo 'hello'
}
sono.