이 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

답변2

어쩌면 다음과 같은 것일 수도 있습니다.

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

관련 정보