파이프에서 증분 읽기

파이프에서 증분 읽기

쉘 스크립트를 stdin.

#!/bin/bash
value=0
while [ "$value" != "-1" ]; do
  read -r -d '' -n 20 value
  if [ "$value" != "-1" ]; then
    dd conv=notrunc status=none of=/path/bigfile.bin bs=1M count=1 seek=$value
  fi
done

간단히 말해서, 대용량 파일의 특정 블록을 원격 위치의 동일한 파일로 복사하려고 합니다. 전송 스크립트에서 전송된 데이터에는 블록 위치(20바이트)와 해당 위치에 기록될 1MiB의 데이터가 있습니다. 위치가 -1이 되면 종료됩니다.

컴파일된 C 프로그램을 실행하면 내 설정이 제대로 작동하지만 이를 방지하고 기본 셸 명령을 사용하여 실행하고 싶습니다. 문제는 dd데이터를 전혀 소비하지 않는 것 같고 모든 데이터가 read명령에 의해 처리된다는 것입니다.

stdin여러 명령으로 사용할 수 있나요 ?

답변1

로 모든 것을 읽을 수 있습니다 dd.

이렇게 하면 작동합니다( read ... value) value=$(dd bs=20 count=1 status=none).

#!/bin/bash
value=0
while [ "$value" != "-1" ]; do
  value=$(dd bs=20 count=1 status=none)
  if [ "$value" != "-1" ]; then
    dd conv=notrunc status=none of=/path/bigfile.bin bs=1M count=1 seek=$value
  fi
done

답변2

실제 질문에 대한 대답은 '예'입니다. stdin파이프하는 순간부터 증분 읽기를 시작할 수 있습니다.

스크립트 문제에 대한 해결책은 dd명령이 1MiB의 데이터를 소비하지 않는다는 것입니다. 쓰기 시 dd65516바이트를 읽게 되는데, 이는 65536(64KiB)에서 블록 크기 20바이트를 뺀 값입니다. 이 제한된 양의 데이터를 읽은 후 dd종료됩니다. 해결책은 flag 를 사용하는 것입니다 iflag=fullblock. 또한 -1에 대한 검사는 작성된 대로 작동하지 않습니다. 완전한 기능적 솔루션은 다음과 같습니다.

value=0
while [ $value != -1 ]; do
  read -r -d '' -n 20 value
  value=$((value))
  if [ $value != -1 ]; then
    dd iflag=fullblock conv=notrunc status=none \
      of=/path/bigfile.bin bs=1M count=1 seek=$value
  fi
done

관련 정보