In Advanced Bash-Scripting Guide , in Beispiel 27-4 , 7. Zeile von unten, habe ich Folgendes gelesen:
Eine Funktion wird als Unterprozess ausgeführt.
Ich habe einen Test in Bash gemacht und es scheint, dass die obige Aussage falsch ist.
Suchanfragen auf dieser Site, Bash Man, und meine Suchmaschine bringen kein Licht.
Haben Sie die Antwort und möchten sie erklären?
Antworten:
Das Advanced Bash-Scripting Guide ist nicht immer zuverlässig, und seine Beispielskripte enthalten veraltete Vorgehensweisen wie die Verwendung der effektiv veralteten Backticks für die Befehlsersetzung, dh
`command`
anstatt$(command)
.In diesem speziellen Fall ist es offensichtlich falsch.
Der Abschnitt über Shell-Funktionen im (kanonischen) Bash-Handbuch besagt dies definitiv
quelle
Funktionen für geschweifte Klammern werden innerhalb des aufrufenden Shell-Prozesses ausgeführt, es sei denn, sie benötigen eine eigene Subshell:
&
Umleitungen oder zusätzliche Umgebung Variablen erzwingen keine neue Subshell:
Wenn Sie die Funktion mit Klammern anstelle von Kurven definieren:
Es wird immer in einem neuen Prozess ausgeführt.
Die
$()
Befehlsersetzung erstellt auch immer Prozesse in bash (aber nicht in ksh, wenn Sie eingebaute Befehle ausführen).quelle
f() (...)
ist erlaubt. Gibt es neben{...}
und noch weitere Definitionen(...)
? In Bash stehe ich noch nicht auf andere.function hw { echo hello world; }
Syntax verwenden (keine Notwendigkeit,()
wenn du etwas eingibst ,function
und du kannst Umleitungen direkt nach dem Finale}
oder)
wie in angebenhw(){ echo error; } >&2
. Das war's auch schon.f()(...)
Führe immer eine eigene Shell aus, währendf(){...}
dies nicht der Fall ist.foo() [[ x = x ]]
ist dies auch eine gültige Funktionsdefinition. Wenn Sie jedoch die Funktion mit betrachten, werdentype foo
Sie feststellen, dass dies immer noch syntaktischer Zucker istfoo() { [[ x = x ]]; }
. Gleiches gilt für Subshell-Funktionen:bar() ( : )
wirdbar() { ( : ); }
.Der fragliche Befehl aus diesem Beispiel sieht folgendermaßen aus:
Das Beispiel später besagt:
Als gemeinnützige Organisation von ABS Guide wollten sie anscheinend schreiben, dass die Funktion in einer Befehlsersetzung ausgeführt wird und der Befehl in einer Befehlsersetzung in einer Subshell ausgeführt wird .
quelle