이름에 "\"가 있는 파일의 체크섬을 찾을 때 md5sum이 체크섬 앞에 "\"를 추가하는 이유는 무엇입니까?
$ md5sum /tmp/test\\test
\d41d8cd98f00b204e9800998ecf8427e /tmp/test\\test
다른 모든 유틸리티에도 마찬가지입니다.
답변1
이것은파일에 기록하다, 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
줄 시작 부분의 백슬래시는 플래그로 사용됩니다. 파일 이름의 이스케이프는 줄이 백슬래시로 시작하는 경우에만 처리됩니다. (이스케이프 해제는 기본 동작일 수 없습니다. 저장된 파일 이름을 포함 \\
하거나 저장하는 이전 버전의 Coreutils에서 생성된 합계를 깨뜨릴 수 있습니다 .)\n
답변2
Stephen Kitt의 답변은 다음과 같습니다.무엇커버해보도록 할게요왜이 변경 사항이 구현되었습니다. 첫째, 개행 문자 1 을 포함하는 파일 이름이 다음을 유발할 수 있다는 것이 관찰되었습니다.모호한 출력. 예를 들어 다음 출력을 고려해보세요.
d41d8cd98f00b204e9800998ecf8427e foo
25af89c92254a806b2e93fffd8ac1814 bar
foo
이는 두 개의 파일 및 이 있다는 뜻입니까 bar
, 아니면 이름이 단 하나의 파일뿐이라는 의미입니까 "foo\n25af89c92254a806b2e93fffd8ac1814 bar"
? 물론 후자의 가능성은 거의 없지만 가능합니다. 모호성을 해결하기 위해 개발자는 백슬래시( \
)를 사용하여 줄 바꿈을 이스케이프 처리하기로 결정했습니다. 그러면 출력이 구별 가능해집니다. 그러나 더 모호한 점이 있습니다.
764efa883dda1e11db47671c4a3bbd9e foo\nbar
파일 이름에 개행 문자 또는 백슬래시 뒤에 개행 문자가 포함되어 있습니까 n
? 이 문제를 해결하려면 백슬래시를 이스케이프 처리해야 합니다. 그러면 후자의 경우는 다음과 같습니다.
764efa883dda1e11db47671c4a3bbd9e foo\\nbar
마지막으로 그들은 이러한 이스케이프 문자를 포함하는 모든 출력 행 앞에 를 추가하기로 결정했습니다 \\
.파서탈출이 완료되었는지 확인합니다. 아마도 이는 파서가 md5sum
이스케이프된 버전과 이스케이프되지 않은(GNU가 아닌) 버전 모두의 출력을 처리할 수 있도록 하기 위해 수행된 것 같습니다. 이 플래그는 또한 필요하지 않을 때 "비용이 많이 드는" 이스케이프가 필요하지 않음을 의미합니다. 이 구문 분석의 예는 다음에서 볼 수 있습니다.md5sum.c
자체(링크된 버전의 382행).
1 개새로운 팀내 말은 \n
때로는 구체적으로 호출되기도 함개행또는만약에;바라보다md5sum.c
.