쉘 스크립트를 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의 데이터를 소비하지 않는다는 것입니다. 쓰기 시 dd
65516바이트를 읽게 되는데, 이는 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