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 ...