> 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 second
werden gleichzeitig gestartet. Die drei Subshells, die dadurch entstehen, werden aufgerufen, first
um zu expandieren "$(first)"
, und die drei sleep 1
Aufrufe 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.