![cat 명령을 dd로 파이프하는 것과 그냥 cat으로 보내는 명령의 차이점은 무엇입니까? [복사]](https://linux55.com/image/136393/cat%20%EB%AA%85%EB%A0%B9%EC%9D%84%20dd%EB%A1%9C%20%ED%8C%8C%EC%9D%B4%ED%94%84%ED%95%98%EB%8A%94%20%EA%B2%83%EA%B3%BC%20%EA%B7%B8%EB%83%A5%20cat%EC%9C%BC%EB%A1%9C%20%EB%B3%B4%EB%82%B4%EB%8A%94%20%EB%AA%85%EB%A0%B9%EC%9D%98%20%EC%B0%A8%EC%9D%B4%EC%A0%90%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F%20%5B%EB%B3%B5%EC%82%AC%5D.png)
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 ...