cat 명령을 dd로 파이프하는 것과 그냥 cat으로 보내는 명령의 차이점은 무엇입니까? [복사]

cat 명령을 dd로 파이프하는 것과 그냥 cat으로 보내는 명령의 차이점은 무엇입니까? [복사]

Linux에서 다음 두 명령의 차이점을 알고 싶습니다.

$ cat ./boot.bin ./kernel.bin /dev/zero | dd bs=512 count=2880 of=devos.img

그리고

$ cat ./boot.bin ./kernel.bin > devos.img

답변1

dd정확한 count바이트 블록을 복사합니다 bs. 이 경우 총 2880*512바이트입니다 (아래 참조) . 이는 두 파일의 연결을 고정된 크기로 자르거나 채웁니다( /dev/zero필요한 수의 0바이트가 제공되므로). 1440kB는 3.5인치 HD 플로피 디스크 크기와 비슷하므로 누군가 플로피 디스크에 꼭 맞는 이미지를 만들고 싶어할 수도 있습니다.

두 번째 예의 일반 콘텐츠는 cat파일을 연결하기만 하며 결과는 임의의 크기가 됩니다.

더 작은 예:

$ echo hello > a; echo world > b
$ cat a b | od -c
0000000   h   e   l   l   o  \n   w   o   r   l   d  \n
$ cat a b /dev/zero | dd bs=1 count=8 2>/dev/null | od -c
0000000   h   e   l   l   o  \n   w   o
$ cat a b /dev/zero | dd bs=1 count=16 2>/dev/null | od -c
0000000   h   e   l   l   o  \n   w   o   r   l   d  \n  \0  \0  \0  \0

실제로 dd한 번의 호출로 블록 크기보다 적은 데이터를 가져오면 읽기 및 쓰기가 줄어듭니다 read(). 이는 더 큰 블록 크기에서 발생할 수 있지만 512에서는 cat데이터가 최소한 해당 크기의 블록에 기록되므로 문제가 되지 않을 수 있습니다 . GNU dd에서는 dd를 사용하여 이를 방지할 수 있습니다 iflag=fullblock.

우리도 같은 일을 할 수 있습니다 head -c:

$ cat a b /dev/zero | head -c 16 ...

관련 정보