与えられたオフセットからファイルの終わりまでファイルを読みたいです。
このプロセス中に読み取ったバイト数を取得し、ファイル出力を別の場所にリダイレクトする必要があります。
これは私のスクリプトです。
...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は変更なしで通常どおり動作します。
tee -a file
ps:代わりに使用できますtee >(cat - >> file))
。
pps:サブシェルから変数をエクスポートできません。サブシェルには常に|
bashまたは$()
.なので、そのようなものを作成する方法はありません。
tee -a >(VAR=$(wc -c)) $file.output
答え2
たぶん、次のようなものがあります。
byteCount=$(tail -c +$skippedBytes $file | tee $file.output | wc -c)