Comment utiliser une variable au lieu d'un file pour sortir cette command wc

Je veux lire un file à partir d'un offset donné jusqu'à la fin de ce file.

J'ai besoin de récupérer le nombre d'octets lus pendant le process et de redirect la sortie du file ailleurs.

Voici mon script:

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

Je voudrais que la partie "wc –bytes" place sa valeur renvoyée dans une variable pour pouvoir l'utiliser après, sans utiliser de file ($ file.count).

Quelque chose comme:

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

Sauf que cela fait, mon script se bloque et ne fonctionne pas.

Est-il possible de le faire et comment?

Vous pouvez utiliser un petit hack avec des redirections:

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

Il redirige toutes les sorties vers 3, que vous avez créées avec exec, puis les ramène à la fin.

Vous devez également redirect toutes les sorties de $ exportCommandSsortingng vers / dev / null, sinon elles seront mélangées avec la sortie wc.

Tous les stderr fonctionneront comme d'habitude, il n'y a aucun changement.

ps: vous pouvez utiliser le tee -a file lieu de tee >(cat - >> file)) .

pps: Vous ne pouvez pas exporter les variables du sous-shell, qui est toujours créé en utilisant pipe | dans bash ou $() . Il n'y a donc aucun moyen de faire quelque chose comme

 tee -a >(VAR=$(wc -c)) $file.output 

Peut-être quelque chose comme ça:

 byteCount=$(tail -c +$skippedBytes $file | tee $file.output | wc -c)