Funktion in Funktion wird bei Bedarf nicht mehrfach aufgerufen?

Funktion in Funktion wird bei Bedarf nicht mehrfach aufgerufen?
> cat b.txt 
function first
    {
    sleep 1
    echo $(echo $$)
    }

function second
    {
    openssl enc -aes-256-cbc -k "$(first)"
    }

echo nyi | second | second | second
> 
> time sh -x b.txt 
+ echo nyi
+ second
+ second
+ second
++ first
++ sleep 1
++ first
++ sleep 1
++ first
++ sleep 1
+++ echo 32383
+++ echo 32383
++ echo 32383
++ echo 32383
+ openssl enc -aes-256-cbc -k 32383
+++ echo 32383
+ openssl enc -aes-256-cbc -k 32383
++ echo 32383
+ openssl enc -aes-256-cbc -k 32383
ɚ��2;��<�Vp��H�����F�q�AHO��Sܽd��d4��X��#}
real    0m1.026s
user    0m0.016s
sys 0m0.025s
> 

Frage: Warum läuft dieses Skript mindestens 3 Sekunden lang?

In der ersten Funktion gibt es ein „sleep 1“ und es sollte in der zweiten Funktion dreimal aufgerufen werden.

Den „echten 0m1.026s“ zufolge scheint der Ruhezustand nur einmal ausgeführt zu werden. Oder wenn er parallel (??) ist, wie kann ich ihn dann linear machen?

Antwort1

Die Teile einer Pipeline werden (nahezu) gleichzeitig gestartet.

Alle drei Aufrufe von secondwerden gleichzeitig gestartet. Die drei Subshells, die dadurch entstehen, werden aufgerufen, firstum zu expandieren "$(first)", und die drei sleep 1Aufrufe werden gleichzeitig ausgeführt (Sie können in der Trace-Ausgabe sehen, dass sieTunpassieren).

Nur die E/A serialisiert eine Pipeline, d. h. ein Prozess in der Pipeline wartet auf die Eingabe des vorherigen oder darauf, dass seine Ausgabe vom nächsten gelesen wird.

So starten, führen Sie die einzelnen Teile der Pipeline nacheinander aus und beenden sie:

echo nyi | second >out1
second <out1 >out2
second <out2

Das heißt, führen Sie sie separat aus und speichern Sie die Zwischenergebnisse in Dateien.

verwandte Informationen