Nun, die Aufgabe ist einfach: Ein Teil meines Skripts muss sowohl md5- als auch sha1-Hashes berechnen. Die Eingabe ist eine Datei - eine große Datei - und Hashes müssen für eine spätere Ausgabekomposition in MD- und SH-Variablen eingefügt werden.
Während die verarbeiteten Dateien wirklich groß sind (Hunderte von GB), versuche ich, Daten nach dem Lesen mehrfach zu verwenden. Ich habe etwas gefunden, das als Prozesssubstitution bezeichnet wird und das ich auf die nächste Weise übernommen habe:
$ dd if=big.tgz 2>/dev/null |tee >(sha1sum ) > >(md5sum ) ;
anstatt:
$ SH=$(sha1sum big.tgz); MD=$(md5sum big.tgz);
Aber ich fand das nächste:
Es gibt anscheinend keine Ressource und keine Zeitersparnis, da beide ungefähr benötigen. 40s (für 4,776 GB Datei)
Ich habe keine Ahnung, wie das Ergebnis des Unterprozesses
>(md5sum )
in der Variablen MD gespeichert werden soll, um es später im Skript zu verwenden
Ich habe versucht, die Pipexec zu verstehen, aber selbst die schönen Farbabbildungen waren bis jetzt kein Erfolg.
Gibt es eine andere Möglichkeit, die Ausgabe auf eine Variable umzuleiten, als VAR = $ (Befehl)?
a
, b
, c
in cmd <(a) <(b) <(c)
) werden immer parallel laufen, nicht sequentiell. Außerdem verwenden moderne Systeme (viel) Caching. Wenn also zwei völlig unterschiedliche Prozesse dieselbe Datei gleichzeitig lesen und sich ihre Geschwindigkeit nicht so stark unterscheidet, werden die Daten nur einmal aus dem Sicherungsspeicher abgerufen.
set $(cut -d' ' -f1 <(md5sum $big) <(sha1sum $big)); md5sum=$1; sha1sum=$2
.