この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は変更なしで通常どおり動作します。

tee -a fileps:代わりに使用できますtee >(cat - >> file))

pps:サブシェルから変数をエクスポートできません。サブシェルには常に|bashまたは$().なので、そのようなものを作成する方法はありません。

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

おすすめ記事