cat
설명서를 올바르게 이해한 경우 :
파일을 연결하고 표준 출력으로 인쇄
cat
파일을 인수로 사용하여 표준 출력으로 인쇄합니다.
내가 이해하지 못하는 것은 다음 명령을 사용하는 것입니다.
cat img.png > copy.png
나는 2개의 동일한 png 파일을 얻을 것입니다. 반면에 만약 내가 단지
cat img.png
내 터미널이 왜곡되어 내가 입력하는 내용을 잘못 해석할 가능성이 높습니다.
- 어떻게 이럴 수있어?
- 바이너리 값은 여전히 바이너리 데이터입니다. 왜 일련의 0과 1 또는 이러한 이진 데이터의 ASCII 해석 또는 터미널의 인코딩이 무엇이든 표시하지 않습니까?
cat
이상한 문자가 포함된 텍스트 파일을 통해서도 이 동작이 가능합니까?- 이 동작을 방지하기 위해 try{}catch{} 문과 같은 메커니즘을 구현해야 합니까?
답변1
cat
명령줄에 인수로 제공된 파일을 연결하고 연결된 출력을 표준 출력으로 인쇄합니다. 이는 바이트를 읽고(개념적으로 한 번에 하나씩) 기본적으로 읽은 바이트에 대한 해석을 수행하지 않습니다.
첫 번째 예에서는 stdout을 파일로 리디렉션하므로 새 파일이 생성됩니다.
두 번째 예에서는 바이트가 터미널에 기록되며 이는 다음과 같습니다.단말기즉, 문자 시퀀스는 터미널에 대한 제어 시퀀스로 해석됩니다. 이것이 터미널에서 이상한 동작이 발생하는 이유입니다. 다음과 관련이 없습니다cat
그 자체.
cat
출력으로 무엇을 할지 잘 모르겠습니다. 해석/처리/인쇄하기 위해 다른 프로그램으로 파이프할 수도 있고, "Singin' in the Rain"을 재생하기 위해 오디오 드라이버에 전달할 수도 있습니다.
따라서 Unix 철학을 따르십시오.
한 가지만 하라, 한 가지만 하되 잘하라
cat
자신이 하려는 일을 추측하거나 설명하려고 해서는 안 됩니다.
~에서@Kiwy 님의 댓글은 다음과 같습니다(구문에 대해 수정됨):
cat
바이너리에 이와 같은 일반 텍스트 명령어가 포함되어 있으면 해석될 수 있다는 의미입니까rm -rf
?
예, 아니오. 설명하겠습니다.
아니요: cat
터미널(터미널 소프트웨어)이 화면에 출력을 보내거나 제어 시퀀스를 해석하기 때문에 터미널을 사용하는 경우(예: 이전 하드웨어를 에뮬레이트하고 있습니다.텔레타이프라이터).
하지만:
예: cat
파이프를 사용하고 수신 프로그램이 문자를 명령으로 해석할 수 있는 경우입니다.
이 예를 살펴보십시오.
cat anyOldShellScript | bash
이 예에서는 bash
얻는 내용이 명령으로 해석되므로 rm -rf
파이프에 전달된 내용에 문자가 있으면 해당 문자가 실행됩니다 cat
.
답변2
나는 이것이 0x20 이하의 코드를 가진 인쇄할 수 없는 문자 때문에 주로 발생한다고 생각합니다. 백스페이스, 삭제 등의 키에 대한 특수 제어/이스케이프 코드입니다.