이름에 “\”가있는 파일의 체크섬을 찾을 때 md5sum이 체크섬 앞에 “\”를 추가하는 이유는 무엇입니까?
$ md5sum /tmp/test\\test
\d41d8cd98f00b204e9800998ecf8427e /tmp/test\\test
다른 모든 유틸리티에도 동일하게 적용됩니다.
답변
이것은 Coreutils에 대해 문서화되어 있습니다md5sum
.
파일 에 백 슬래시 나 줄 바꿈이 포함 된 경우 줄은 백 슬래시로 시작하고 파일 이름의 문제가있는 각 문자는 백 슬래시로 이스케이프되므로 임의의 파일 이름이 있더라도 출력이 명확하게 표시됩니다.
( 파일 은 파일 내용 이 아니라 파일 이름입니다).
b2sum
, sha1sum
및 다양한 SHA-2 도구 는와 같은 방식으로 동작합니다 md5sum
. sum
그리고 cksum
하지 않습니다; sum
단지 이전 버전과의 호환성을 위해 제공됩니다 (그 조상 출력을 인용 생성하지 않는)하고 cksum
있다 POSIX에 의해 지정된 출력의 유형을 허용하지 않습니다.
이 동작은 2015 년 11 월 에 도입되었으며 버전 8.25 (2016 년 1 월)에서 다음 NEWS
항목 과 함께 릴리스되었습니다 .
md5sum
이제 줄의 시작 부분에 ‘\’를 사용하고 줄 바꿈을 ‘\ n’으로 바꾸어 표준 출력에서 파일 당 한 줄씩 표시합니다. 이것은 또한 영향을sha1sum
,sha224sum
,sha256sum
,sha384sum
와sha512sum
.
줄 시작 부분의 백 슬래시는 플래그 역할을합니다. 파일 이름의 이스케이프는 줄이 백 슬래시로 시작하는 경우에만 처리됩니다. (이스케이프 처리는 기본 동작이 될 수 없습니다 . 저장된 파일 이름을 포함 \\
하거나 \n
저장된 파일 이름 으로 이전 버전의 Coreutils에서 생성 된 합계를 깰 수 있습니다.)
답변
Stephen Kitt의 답변은 무엇을 다루고 있으며이 변경이 구현 된 이유 를 다루려고합니다 . 먼저 누군가 줄 바꿈 1을 포함하는 파일 이름으로 인해 결과가 모호 해질 수 있음을 관찰했습니다 . 예를 들어, 다음 출력을 고려하십시오.
d41d8cd98f00b204e9800998ecf8427e foo
25af89c92254a806b2e93fffd8ac1814 bar
이 두 개의 파일 평균이되었다 하는가 foo
와 bar
, 또는 그 파일 이름 만 하나 개의 파일은 "foo\n25af89c92254a806b2e93fffd8ac1814 bar"
? 물론, 후자의 가능성은 거의 없지만 가능합니다. 모호성을 해결하기 위해 개발자는 백 슬래시 ( \
)를 사용하여 줄 바꿈을 피하기로 결정했습니다 . 그러면 출력이 구별됩니다. 그러나 다음과 같은 추가 모호성이 있습니다.
764efa883dda1e11db47671c4a3bbd9e foo\nbar
이 파일 이름에 줄 바꿈 또는 백 슬래시 뒤에 n
? 가 포함되어 있습니까? 이 문제를 해결하려면 백 슬래시도 이스케이프 처리해야합니다.
764efa883dda1e11db47671c4a3bbd9e foo\\nbar
마지막으로 파서 가 이스케이프가 수행되었는지 \\
쉽게 감지 할 수 있도록 이러한 이스케이프가 포함 된 각 출력 행 앞에 추가하기 로 결정했습니다 . 아마도 이것은 구문 분석기가 이스케이프 버전 과 비 이스케이프 버전 (GNU 이외)의 출력을 처리 할 수 있도록하기 위해 수행 된 것 입니다. 또한이 플래그는 필요하지 않은 경우 “비용이 많이 드는”탈출을 수행 할 필요가 없음을 의미합니다. 이 구문 분석 자체 의 예를 볼 수 있습니다 (링크 된 버전의 382 행).md5sum
md5sum.c
1 바이 개행 I 캐릭터 의미 \n
때때로 구체적이라 바꿈 또는 LF를 ; 참조하십시오 md5sum.c
.