Hoffentlich ist diese Frage nicht zu allgemein. Ich bin sehr neu in Shell-Scripting und komme aus einer Computerarchitektur / Nicht-Scripting-Programmierung. Ich habe bei den Skripten bei meiner Arbeit festgestellt, dass die Skripte selten geschrieben werden, indem eine Unter-Shell um das gesamte Skript erstellt wird. In den Skripten, die ich schreibe, bin ich es, wenn ich es mit einer Sub-Shell umhüllen kann, da es verhindert, dass es mit anderen Skripten, die meine aufrufen, in Konflikt gerät (nur für den Fall). Ist dies nicht eine gängige Praxis, da mit diesem Ansatz ein gewisser Aufwand verbunden ist? Es fällt mir schwer, dies online zu finden.
Beispiel:
#!/bin/bash
( #Start of subshell
echo "Some stuff here"
) #End of subshell
source
oder führen sie stattdessen Ihr Skript aus?bash
und z. B. C. Die wahre Antwort auf diese "Overhead" -Frage ist wirklich eine Nichtantwort: Wenn Wenn Sie sich Sorgen über den Leistungsaufwand machen, sollten Sie kein Shell-Skript verwenden.somefunction() ( ... )
(Beachten Sie die Parens anstelle von Locken)somefunction
Es ist nicht ungewöhnlich, anzugeben, dass immer eine Unterschale erstellt werden soll. Ich glaube jedoch nicht, dass tatsächliche Skripte in Klammern eingeschlossen werden müssen.Antworten:
Unterschalen haben Overhead.
Auf meinem System sind die minimalen Fork-Exec-Kosten (wenn Sie ein Programm von der Festplatte ausführen, wenn die Datei nicht kalt ist) ungefähr
2ms
und die minimalen Fork-Kosten ungefähr1ms
.Bei Subshells sprechen Sie nur von den Forking-Kosten, da keine Datei bearbeitet werden muss
exec
. Wenn die Unterschalen angemessen niedrig gehalten werden,1ms
ist dies in Programmen mit menschlichem Gesicht vernachlässigbar. Ich glaube, die Menschen können nichts bemerken, was schneller passiert als50ms
(und so lange dauert es in der Regel , bis moderne Dolmetscher für Skriptsprachen überhaupt anfangen (ich sprechepython
und binrvm
hier drin ) mit dem neuestennodejs
Thema beginnen100ms
).Es summiert sich jedoch zu Schleifen, und dann möchten Sie möglicherweise beispielsweise den häufig vorkommenden Bactick oder das
$()
Muster ersetzen, bei dem Siereturn
etwas von einer Funktion drucken, indem Sie es auf stdout drucken, damit die übergeordnete Shell mit Bashismen wieprintf -v
(oder einem schnellen externen) katpure Programm zur Verarbeitung der gesamten Charge).Das Bash-Completion- Paket vermeidet diese Subshell-Kosten speziell, indem es über übergebene Variablennamen mithilfe einer unter http://fvue.nl/wiki/Bash:_Passing_variables_by_reference beschriebenen Technik zurückgibt
Vergleichen
mit
sollte Ihnen eine gute Schätzung des
fork
Systemaufwands geben.quelle
$(echo $text | cut ...)
Aufrufe, die Teilzeichenfolgen aus Text extrahieren, durch${text##substr}
Aufrufe ersetzt und die Ausführungszeit drastisch reduziert.Das Ausführen des hervorragenden Codes von PSkocik auf meinem System zeigte vernachlässigbare Ergebnisse.
Dieses Beispiel trifft jedoch wirklich auf native Befehle im Vergleich zu Subshell-Befehlen:
quelle