sha256sum이 파일 끝 신호와 입력 끝 신호를 다르게 처리하는 이유는 무엇입니까?

sha256sum이 파일 끝 신호와 입력 끝 신호를 다르게 처리하는 이유는 무엇입니까?

간단한 문자열, 즉 "abc"의 sha256을 계산하려고 합니다. 나는 사용하여 발견했다샤256섬다음과 같은 유틸리티:

sha256sum file_with_string

다음과 같은 결과를 제공합니다.

sha256sum # enter, to read input from stdin
abc
^D

지금 바로:

edeaaff3f1774ad2888673770c6d64097e391bc362d7d6fb34982ddf0efd18cb

종료 신호가 입력되기 전에 또 다른 개행 문자가 표준 입력에 제공된다는 점에 유의하십시오.


처음에 나를 괴롭혔던 것은 온라인 체크섬 계산기를 사용하여 이를 확인하기로 결정했을 때 결과가 달랐다는 것입니다.

ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad

내 생각엔 이것이 내가 stdin에 입력한 두 번째 개행 문자와 관련이 있을 것 같습니다.그래서 이번에는 ^D를 두 번 삽입해 보았습니다(개행 문자 대신).결과는 다음과 같습니다.

abcba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad

물론 이는 형식이 잘못되었지만(개행 누락으로 인해), 그 외에는 위와 일치합니다.

나중에 나는 쉘의 입력 구문 분석에 대해 분명히 이해하지 못했다는 것을 깨달았습니다. 꼼꼼히 확인해보니 추가사항은 없습니다새로운 팀원래 지정한 파일에 있는데 왜 이런 문제가 발생합니까?

답변1

차이점은 개행 문자입니다. 먼저 abcsha256sums의 합계를 수집합니다 abc\n.

$ printf 'abc\n' | sha256sum 
edeaaff3f1774ad2888673770c6d64097e391bc362d7d6fb34982ddf0efd18cb  -
$ printf 'abc' | sha256sum 
ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad  -

따라서 ba...ad합계는 문자열에 대한 abc것이고 ed..cb1은 에 대한 것입니다 abc\n. 이제 파일에 출력이 표시되면 ed..cb파일에 개행 문자가 있다는 의미입니다. 그리고 "텍스트 파일"을 고려하면필요하다후행 개행, 새 파일을 생성하면 대부분의 편집자가 파일을 추가합니다.

개행 없이 파일을 얻으려면 printf위의 방법을 사용하십시오. file파일에 개행 문자가 없으면 어떻게 경고가 표시되는지 확인하세요 .

$ printf 'abc' > file
$ file file
file: ASCII text, with no line terminators

그리고

$ printf 'abc\n' > file2
$ file file2
file2: ASCII text

지금:

$ sha256sum file file2
ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad  file
edeaaff3f1774ad2888673770c6d64097e391bc362d7d6fb34982ddf0efd18cb  file2

답변2

sha256sum # enter, to read input from stdin
abc
^D

그래서 ^D이번에는 (새줄을 사용하는 대신) 두 번 삽입을 시도했습니다.

tty에서 ^D( )를 누르면VEOF정식 모드(모든 명령줄 창, xterm 등의 기본값), 터미널 드라이버("줄 규칙")는 개행 문자를 기다리지 않고 즉시 버퍼링된 데이터를 tty에서 읽는 프로세스에 사용할 수 있도록 만듭니다.

를 입력 하면 abc, 뒤의 문자열이 읽혀지고 ( 즉, 다음으로 끝남) , 뒤의 빈 문자열(즉, 크기가 0인 콘텐츠가 읽혀짐)이 파일의 끝으로 해석됩니다.<newline>^Dsha256sum"abc\x0a"LF<newline>""^Dsha256sum

을 입력 abc하면^D 두 배, 첫 번째 문자열 이후의 문자열을 읽고 sha256sum두 번째 문자열 이후의 빈 문자열을 다시 읽습니다 ."abc"^D""^D

따라서 전자의 경우 출력에 추가 개행 문자가 포함되고 체크섬이 sha256sum달라집니다.

일반 파일의 경우, sha256sum도달할 때까지 읽기가 계속됩니다.파일 끝, 여기서 위의 두 경우에만 읽기가 빈 문자열을 반환합니다. sha256입력이 터미널인지, 파이프인지, 일반 파일인지 전혀 알 수 없는 상황도 비슷합니다 .

관련 정보