如何使用变量而不是文件来输出此 wc 命令

如何使用变量而不是文件来输出此 wc 命令

我想从给定的偏移量读取一个文件,直到该文件的末尾。

我需要检索在此过程中读取的字节数,并将文件的输出重定向到其他地方。

这是我的脚本:

...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"

我希望“wc --bytes”部分将其返回值放入变量中,以便我可以在之后使用它,而无需使用文件($file.count)。

就像是:

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

除此之外,我的脚本挂起并且不起作用。

是否可以做到这一点以及如何做到?

答案1

您可以使用带有重定向的小技巧:

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

它将所有输出重定向到您使用 exec 创建的 3,然后最后将其返回到 1。

您还需要将所有输出从 $exportCommandString 重定向到 /dev/null,否则它将与 wc 输出混合。

所有 stderr 将照常工作,没有任何变化。

ps:您可以使用tee -a file代替tee >(cat - >> file)).

pps:您无法从子 shell 导出变量,子 shell 总是|在 bash 或$().所以没有办法制作类似的东西

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

答案2

也许是这样的:

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

相关内容