So verwenden Sie eine Variable anstelle einer Datei, um diesen wc-Befehl auszugeben

7

Ich möchte eine Datei von einem bestimmten Versatz bis zum Ende dieser Datei lesen.

Ich muss die Anzahl der Bytes abrufen, die während des Prozesses gelesen wurden, und auch die Ausgabe der Datei an eine andere Stelle umleiten.

Hier ist mein Skript:

...some stuff here...
dd if=$file bs=1 skip=$skippedBytes | tee >(wc --bytes > $file.count) >(cat - >> $file.output) | $($exportCommandString $file)
byteCount=$(cat $file.count)
rm $file.count
echo "Number of read bytes: $byteCount"

Ich möchte, dass der Teil "wc --bytes" seinen zurückgegebenen Wert in eine Variable einfügt, damit ich ihn später verwenden kann, ohne eine Datei ($ file.count) zu verwenden.

Etwas wie:

dd if=$file bs=1 skip=$skippedBytes | tee >(byteCount=$(wc --bytes)) >(cat - >> $file.output) | $($exportCommandString $file)
echo "Number of read bytes: $byteCount"

Abgesehen davon hängt mein Skript und funktioniert nicht.

Ist das möglich und wie?

Lauhub
quelle
Dieses Problem wurde gelöst, ist aber mit dem folgenden verknüpft: unix.stackexchange.com/questions/67494/…
lauhub

Antworten:

4

Sie können einen kleinen Hack mit Weiterleitungen verwenden:

byteCount=$( exec 3>&1 ; 
     dd if=$file  bs=1  skip=$skippedBytes | tee -a >(wc -c >&3) $file.output |\
     $($exportCommandString $file) > /dev/null ;  3>&1   )

Es leitet alle Ausgaben auf 3 um, die Sie mit exec erstellt haben, und gibt sie am Ende wieder auf eins zurück.

Sie müssen auch die gesamte Ausgabe von $ exportCommandString nach / dev / null umleiten, da sie sonst mit der wc-Ausgabe gemischt wird.

Alle stderr funktionieren wie gewohnt, es gibt keine Änderungen.

ps: du kannst tee -a filestatt verwenden tee >(cat - >> file)).

pps: Sie können keine Variablen aus der Subshell exportieren, die immer erstellt wird, wenn Pipe |in Bash oder verwendet wird $(). Es gibt also keine Möglichkeit, so etwas zu machen

tee -a >(VAR=$(wc -c)) $file.output
eilen
quelle
Ich habe einen kleinen Tippfehler korrigiert (fehlende schließende Klammer). Vielen Dank für diese vollständige Antwort.
Lauhub
1

Vielleicht so etwas:

byteCount=$(tail -c +$skippedBytes $file | tee $file.output | wc -c)
Jurij
quelle
Nicht genau das, was ich erwartet hatte, aber es funktioniert auch. Danke
Lauhub