In Beginn der Linux-Programmierung Buchen. Es gibt einen Abschnitt über Anweisungsblock . In diesem Abschnitt sieht die Erklärung wie folgt aus.
Anweisungsblöcke
Wenn Sie mehrere Anweisungen an einer Stelle verwenden möchten, an der nur eine zulässig ist, wie z. B. in einer UND- oder ODER-Liste,
können Sie dies tun, indem Sie sie in geschweifte Klammern {} einschließen, um einen Anweisungsblock zu bilden. Sehen Sie sich beispielsweise den folgenden Code an:
get_confirm && {
grep −v "$cdcatnum" $tracks_file > $temp_file
cat $temp_file > $tracks_file
echo
add_record_tracks
}
Bitte erklären Sie, wie der Code im Anweisungsblock ausgeführt wird…
Akzeptierte Antwort:
Der Code in { ... } genau so ausführen, wie es ohne die geschweiften Klammern ausgeführt worden wäre, außer dass es jetzt vom Exit-Status von get_confirm abhängig ist .
Wenn get_confirm mit einem Null-Exit-Status („Erfolg“) beendet wird, wird der Block ausgeführt, andernfalls nicht.
Es ist äquivalent zu
if get_confirm; then
# the contents of the block goes here
fi
(was meiner Meinung nach schöner aussieht)
Das Beispiel des Buches ist meiner Meinung nach kein gutes Beispiel für eine übliche Verwendung von { ... } . Ein besseres Beispiel wäre gewesen
{ echo 'hello world'; date; } >file
die eine einzige Umleitung verwendet, um die Standardausgabe beider Befehle im { ... } umzuleiten Block in dieselbe Datei.
Dies ist ähnlich (und hat in diesem Fall den gleichen Effekt wie)
( echo 'hello world'; date ) >file
aber die Anweisungen innerhalb von { ... } wird in derselben Umgebung wie die Shell ausgeführt, während die Anweisungen in ( ... ) wird in einer Subshell (einer separaten Umgebung) ausgeführt.
Sie können den Unterschied mit
sehen{ a=42; }; echo $a
und
( a=1973 ); echo $a
Der erste gibt 42 aus während die zweite nicht 1973 ausgibt (Die Zuweisung erfolgt in einer Unterschale und kann die Umgebung außerhalb nicht beeinflussen).
Hinweis zur Grammatik:Der abschließende } eines { ... } block muss auf einen Zeilenumbruch oder einen ; folgen . { echo 'hello' } ist nicht gültig, während sowohl { echo 'hello'; } und
{
echo 'hello'
}
sind.