我想从给定的偏移量读取一个文件,直到该文件的末尾。
我需要检索在此过程中读取的字节数,并将文件的输出重定向到其他地方。
这是我的脚本:
...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)