![이 wc 명령을 출력하기 위해 파일 대신 변수를 어떻게 사용할 수 있습니까?](https://linux55.com/image/29754/%EC%9D%B4%20wc%20%EB%AA%85%EB%A0%B9%EC%9D%84%20%EC%B6%9C%EB%A0%A5%ED%95%98%EA%B8%B0%20%EC%9C%84%ED%95%B4%20%ED%8C%8C%EC%9D%BC%20%EB%8C%80%EC%8B%A0%20%EB%B3%80%EC%88%98%EB%A5%BC%20%EC%96%B4%EB%96%BB%EA%B2%8C%20%EC%82%AC%EC%9A%A9%ED%95%A0%20%EC%88%98%20%EC%9E%88%EC%8A%B5%EB%8B%88%EA%B9%8C%3F.png)
주어진 오프셋부터 파일 끝까지 파일을 읽고 싶습니다.
이 프로세스 중에 읽은 바이트 수를 검색하고 파일 출력을 다른 곳으로 리디렉션해야 합니다.
이것은 내 스크립트입니다.
...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)