Werden Funktionen in Bash als Unterprozesse ausgeführt?

In Advanced Bash-Scripting Guide in Beispiel 27-4 , 7. Zeile von unten, ich habe Folgendes gelesen:

Eine Funktion wird ausgeführt als ein Unterprozess.

Ich habe einen Test in Bash durchgeführt, und es scheint, dass die obige Aussage falsch ist.

Sucht weiter Diese Seite, Bash Man und meine Suchmaschine bringen kein Licht.

Haben Sie die Antwort und möchten sie erklären?

Kommentare

  • Wie bereits erwähnt, ist dieser Leitfaden extrem irreführend. Ich empfehle stattdessen den Wooledge Bash Guide .
  • Eine wichtige Tatsache ist, dass “ Bash “ vermeidet das Erstellen von Subshells. Sie sind teuer, haben eine eigene Umgebung und wirken sich auf die Leistung des Skripts sowie auf die Art und Weise aus, wie der Code fließt (oftmals unpraktisch, um mit ihren Besonderheiten umzugehen). Der tatsächliche Zustand von Bash ist ein Produkt einer Evolution, einer Code-Evolution. Ich meine, die erste Version von Bash verwendet mehr Subshells *** als die eigentliche. Diese Art von Inkonsistenz scheint vernünftig zu sein. *** Wenn Sie einen Beweis wollen, kann ich Ihnen ‚ nichts geben. Ich ‚ habe es von Webseiten, Kommentaren … abgeleitet. ‚ habe diese Aussage vor einiger Zeit irgendwo gelesen.

Antwort

Das Advanced Bash-Scripting Guide ist nicht immer zuverlässig und seine Beispielskripte enthalten veraltete Vorgehensweisen wie die Verwendung von veraltete Backticks für die Befehlsersetzung, dh `command` anstelle von $(command).

In diesem speziellen Fall ist es offensichtlich falsch.

Der Abschnitt über Shell-Funktionen im (kanonischen) Bash Das Handbuch gibt definitiv an, dass

Shell-Funktionen im aktuellen Shell-Kontext ausgeführt werden. Es wird kein neuer Prozess zum Interpretieren erstellt.

Kommentare

  • “ Das erweiterte Bash-Scripting-Handbuch ist im Allgemeinen unzuverlässig. “ Sehr wahr.
  • Können Sie Referenzen zur Unterstützung Ihrer erster Satz?
  • @WillVousden Wie würde eine Referenz hier aussehen? Eine Reihe von Beispielen für die technischen Mängel des Leitfadens ‚? Ein Dokument, in dem Experten der Bash-Community zuvor festgestellt haben, dass es unzuverlässig ist? Wäre es hilfreich, wenn ein Stackoverflow-Mitglied mit einem goldenen Abzeichen in Bash gerade in einem Kommentar zustimmen würde? : p
  • @WillVousden Ich glaube nicht, dass das, was Sie wollen, in einer zuverlässigen Form existiert. Mendel Cooper hat in der Vergangenheit Probleme mit dem Handbuch aktualisiert und behoben, aber es gibt keinen öffentlichen Bug-Tracker oder eine Liste von Errata. (Vielleicht ist das die schlimmste Aussage, die ich machen kann.) Wenn wir also einen (wahrgenommenen oder realen) Fehler finden, können wir dem Autor nur eine E-Mail senden und auf das Beste hoffen.
  • @WillVousden, .. Wenn Sie eine Historie darüber wünschen, wie lange der Konsens im Freenode-#Bash-Kanal besteht, dass das ABS vermieden werden sollte, lesen Sie Wooledge.org/ ~ greybot / meta / abs – Das zweite Feld in jeder Zeile ist der Zeitstempel und das erste ist der Benutzername. Ich ‚ hoffe, dass die Behauptung, dass die fraglichen Benutzernamen sehr angesehene Personen sind, ausreicht.

Antwort

Geschweifte Klammerfunktionen werden innerhalb des aufrufenden Shell-Prozesses ausgeführt, es sei denn, sie benötigen eine eigene Subshell:

  • , wenn Sie sie im Hintergrund ausführen mit &
  • , wenn Sie sie als Link in einer Pipeline ausführen

Umleitungen oder zusätzliche Umgebung. Variablen erzwingen keine neue Unterschale:

hw(){ echo hello world from $BASHPID echo var=$var } var=42 hw >&2 echo $BASHPID #unexports var=42 and restores stdout here 

Wenn Sie die Funktion mit Klammern anstelle von Locken definieren:

hw()( echo hello world from $BASHPID ) hw echo $BASHPID 

wird immer in einem neuen Prozess ausgeführt.

Befehlssubstitution $() erstellt auch immer Prozesse in bash (aber nicht in ksh if Sie führen integrierte Funktionen aus.

Kommentare

  • Ich wusste nicht, dass ‚ f() (...) ist zulässig. Gibt es außer {...} und (...) noch andere Definitionen? In Bash, I ‚ m noch nicht in andere.
  • @tomas Sie können die Syntax function hw { echo hello world; } verwenden ((), wenn Sie function eingeben und Umleitungen direkt nach dem endgültigen } oder ) wie in hw(){ echo error; } >&2. Das ‚ ist darüber.
  • Dies ist die Antwort, über die ich sofort nachgedacht habe, und sie ist absolut richtig.Es sollte als die richtige Antwort gewählt werden. f()(...) führt immer eine eigene Shell aus, während f(){...} dies nicht tut.
  • NB-Bash-Funktionen akzeptieren daher alle zusammengesetzten Befehle foo() [[ x = x ]] ist ebenfalls eine gültige Funktionsdefinition. Wenn Sie sich jedoch die Funktion mit type foo ansehen, werden Sie ‚ feststellen, dass dies immer noch syntaktischer Zucker für . Gleiches gilt für Subshell-Funktionen: bar() ( : ) wird zu bar() { ( : ); }.
  • @kojiro nice +1. ‚ wusste nicht, dass

Antwort

Der Befehl in Die Frage aus diesem Beispiel sieht folgendermaßen aus:

echo ${arrayZ[@]/%e/$(replacement)} 

Im späteren Beispiel heißt es:

# $( ... ) is command substitution. # A function runs as a sub-process. 

Da sie für ABS Guide gemeinnützig sind, wollten sie anscheinend schreiben, dass die Funktion in einer Befehlssubstitution und der Befehl in einer Befehlssubstitution in einer Subshell ausgeführt wird. P. >

Kommentare

  • Das ‚ ist sehr irreführend. Vielen Dank für Ihre Interpretation.
  • @tomas “ sehr irreführend. “ Ja, sehr. Im Gegensatz zum ABS-Handbuch ist Greg ‚ s Wiki eine hervorragende Quelle für erweiterte Bash-Informationen.
  • Prost. Was ‚ ist Ihre Meinung zu diesem Thema: wiki.bash-hackers.org/start ?
  • @tomas Ich habe keine Kenntnis aus erster Hand darüber.
  • @tomas, … meine eigene Meinung zum Bash-Hacker-Wiki ist, dass es ‚ ist eine ausgezeichnete Quelle. Ich habe ‚ es nicht so umfassend durchgearbeitet wie das Wooledge-Wiki, aber es ist in der Regel genau und präzise geschrieben.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.