
주어진 오프셋부터 파일 끝까지 파일을 읽고 싶습니다.
이 프로세스 중에 읽은 바이트 수를 검색하고 파일 출력을 다른 곳으로 리디렉션해야 합니다.
이것은 내 스크립트입니다.
...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)