shasum
도달 할 수 있는 방법이 있나요오직해시 값을 인쇄하시겠습니까?
출력을 다른 프로그램으로 파이프하면 이것이 가능하다는 것을 알고 있습니다.
shasum something | cut -d' ' -f1
shasum
결과를 다른 곳에 파이핑하지 않고 그냥 사용하여 이를 달성할 수 있는 방법이 있습니까 ?
답변1
캔트. Perl shasum 6.02 및 GNU coreutils 9.1의 해당 프로그램에서는 파일 이름(표준 입력에서 사용할 수 있음) 없이 -
해시의 16진수 표현을 인쇄할 수 있는 방법이 없습니다.
하지만 이것이 문제가 되지 않도록 하세요! 쉘은 여러 프로그램을 결합하도록 설계되었으며파이프는 인클로저의 필수 기능입니다.. 오류를 허용하지 않도록 조심해야 합니다. 이는 sh 파이프라인의 설계 결함입니다.
일반 sh에서는 쉘 파이프보다 명령 대체를 통해 "숨겨진" 파이프를 사용하는 것이 실제로 더 쉽습니다.
out=$(shasum <something) && echo "${out%%[!0-9A-Za-z]*}"
설명: 명령의 첫 번째 부분( 이전 &&
) out
은 의 출력을 설정합니다 shasum
. 단순 할당이므로 단일 명령 교체 상태이므로 실패하면 실패한다 shasum
. 운영자는 &&
왼쪽이 실패하면 전체 명령이 실패하도록 보장합니다. 왼쪽이 성공하면 오른쪽에 출력의 선행 영숫자가 인쇄됩니다. ( … && echo "${out%% *}"
또한 향후 버전에서 탭을 사용한다면 위 버전이 조금 더 강력해질 것입니다.)
답변2
아니요, shasum
해시가 계산된 파일의 파일 이름을 인쇄하거나 -
표준 입력에서 읽은 경우 항상 인쇄합니다.
파이프를 피하려면 다음을 사용할 수 있습니다.
perl -MDigest::SHA -e '$s=Digest::SHA->new(); $s->add(<>); print $s->hexdigest(),"\n"' filename
답변3
sha1sum
FWIW, ast-open (또는) 은 if 의 내장 기능 cksum -x sha1
일 수도 있고 ast-open의 일부로 구축되거나( via 또는 front 에서 활성화됨 ) 입력하는 동안 체크섬 합계 기준을 인쇄하는 FreeBSD에 있는 유틸리티일 수도 있습니다.sha1sum
ksh93
builtin sha1sum
/opt/ast/bin
$PATH
sha1
따라서 이러한 구현을 통해 다음을 수행할 수 있습니다.
sha1sum < thefile
sha1 < thefile
$ ./ast-open/arch/linux.i386-64/bin/ksh
$ builtin sha1sum
$ whence -a sha1sum
sha1sum is a shell builtin
sha1sum is a shell builtin version of /usr/bin/sha1sum
$ echo test | sha1sum
4e1243bd22c66e76c2ba9eddc1f91394e57f9f83
$ echo test | /usr/bin/sha1sum
4e1243bd22c66e76c2ba9eddc1f91394e57f9f83 -
openssl sha1
hexdump -e '20/1 "%02x" "\n"'
다음을 사용하여 16진수로 변환할 수 있는 원시 체크섬을 인쇄하는 것도 가능합니다 xxd -p
.
openssl sha1 -binary -- "$file" | xxd -p
sha1sum
출력의 GNU 구현 <thehexsum> -
(두 번째 공백은 *
이를 나타내기 위해 대체될 수 있음)바이너리 모드MSDOS와 같은 시스템에서), shasum
.output perl
( GNU coreutils 형식을 에뮬레이트하도록 설계됨 ) openssl sha1
출력용(stdin)= <thehexsum>
openssl sha1 -r
-r
<thehexsum> *stdin
따라서 이미 말했듯이 이에 대해 다음에서 체크섬을 추출해야 합니다.
sha1sum < "$file" | awk '{print $1}'
(및 set -o pipefail
보존(또는 파일 입력 리디렉션) 실패에 대한 사전 지원( sha1sum
있는 경우))
또는 POSIX와 유사한 셸에서:
sum=$(sha1sum < "$file") && sum=${sum%%[[:space:]]*}
[[:space:]]*
[![:xdigit:]]*
16진수가 아닌 첫 번째 숫자 문자로 시작하는 모든 항목을 제거 하여 바꿀 수도 있습니다 .
답변4
cut
다음 명령을 사용할 수 있습니다.
- 절개 부위에 튜브를 삽입할 필요가 없습니다.
$ sha256sum ~/hwinfo.txt
d7e1653cc9e37552a70a9daebefdc3bc25949a691086cd325d071a98dfc105aa /home/user/hwinfo.txt
cut
2. 공간을 구분자로 활용 시 파이프 삽입
$ sha256sum ~/hwinfo.txt | cut -d" " -f 1
d7e1653cc9e37552a70a9daebefdc3bc25949a691086cd325d071a98dfc105aa
3개의 필드가 있습니다.
필드 1은 sha256sum입니다.
$ sha256sum ~/hwinfo.txt | cut -d" " -f 1
d7e1653cc9e37552a70a9daebefdc3bc25949a691086cd325d071a98dfc105aa
필드 2는 두 공백 사이에 아무것도 없기 때문에 비어 있습니다.
$ sha256sum ~/hwinfo.txt | cut -d" " -f 2
필드 3은 파일 이름입니다.
$ sha256sum ~/hwinfo.txt | cut -d" " -f 3
/home/user/hwinfo.txt