왜냐하면 파일 이름을 pv
(매뉴얼 페이지), (이상한 스위치를 제외하면 -N
파일 이름 자체가 아닌 접두사 역할을 합니다.), 파이프를 통해 출력되는 텍스트 sha512sum
나 다른 shaXsum 출력의 끝을 수동으로 편집해야 합니다. 예를 들면 다음과 같습니다.
pv -W "$file" | sha512sum -b
변수에 저장하고 있는데 sha_output
여러분께 드리고 싶은 말씀은더 순수하다예를 들어 원래 코드는 다음과 같습니다.
sha_output=$( pv -W "$file" | sha512sum -b )
해시 합계 텍스트 출력의 예:
2a19f5852ba8f76bd5a67db18539d609baaf3888b27a57181564db01ef6c16812c60e306973edc059221f61bf2ad9f4b4ef5ff09bbcef98e74a27971c67bdc18 *-
원하는 출력:
2a19f5852ba8f76bd5a67db18539d609baaf3888b27a57181564db01ef6c16812c60e306973edc059221f61bf2ad9f4b4ef5ff09bbcef98e74a27971c67bdc18 linuxmint-19.2-cinnamon-64bit.iso
(예, 해시 값과 파일 이름 사이에 공백이 2개 있습니다.)
마지막으로 파일 이름이 이라는 변수에 저장되어 있다고 가정해 보겠습니다 file_name
.
용액에는 어떤 것도 포함되어서는 안 됩니다.바시즘, 휴대용 전용(POSIX) 해결책을 제시해주세요.
이것의 도움으로답변, 다음을 컴파일했습니다.
printf '%s\n' "${sha_output//\*-/$file_name}"
놀랍게도 Bash에서는 (다소) 작동하지만 Dash에서는 다음 메시지와 함께 오류가 발생합니다.
bad substitution
의견에 따르면 중괄호 확장은 POSIX에 의해 정의되지 않았기 때문에 이는 놀라운 일이 아닙니다.
답변1
$file
체크섬 출력으로 대체하려는 단일 파일의 이름 또는 경로 이름이라고 가정합니다 .
pv "$file" | sha256sum | { IFS=' ' read sum junk && printf '%s %s\n' "$sum" "$file"; }
파이프라인의 마지막 부분은 첫 번째 줄에서 체크섬과 sha256sum
기타 출력을 읽은 다음 체크섬과 원래 파일 이름을 인쇄합니다.
sha256sum -b
이러한 도구는 Unix에서 바이너리 파일과 텍스트 파일을 구별하지 않기 때문에 실제로는 이것이 필요하지 않습니다 .
답변2
이미 변수에 있는 명령 출력을 캡처하고 있으므로 변수를 "캡처하고 수정할" 수 있습니다(POSIXly, 대시에서 yes 실행).
sha_output=$( pv -W "$file" | sha512sum -b)
sha_output="${sha_output%\*-} $file"
${...%\*-}
후행이 제거 되고 *-
공백과 파일 이름이 추가됩니다. 실제로 이 -b
모드는 파일에 액세스할 때 바이너리 모드와 텍스트 모드를 구별하는 운영 체제(예: MS-DOS에만 해당)에서만 유용합니다. 따라서 -b
옵션이 필요하지 않으며 shaXsum
별표( *
)(신호 바이너리 모드)는 공백(신호 텍스트 모드)이 됩니다.
캡처하지 않지만 인쇄물을 원하는 경우 다음을 사용할 수 있습니다.
$ printf '%s\n' "$(pv "$file" | sha256sum | sed 's/-$//')$file"
2a19f5852 ... a27971c67bdc18 linuxmint-19.2-cinnamon-64bit.iso
또는@쿠살라난다답변.
모든 답변은 동일하게 유효하고 POSIX를 준수하며 유용합니다.
위의 모든 내용은 shaXsum
특정 파일 이름(줄 바꿈 또는 슬래시 포함)으로 인해 해시 줄이 백슬래시로 시작되는 정확한 동작을 모방하지 않습니다.
백슬래시 포함) 의 경우 file='wo\\rds'
출력은 다음과 같습니다.
$ sha256sum "$file"
\f6c94d35691b9c356f7e5072f94d23f127b168cf9b04f0f5b26e0cb1f6ef4414 wo\\rds
해당 줄은 백슬래시로 시작하고 파일 이름에서 문제가 있는 문자는 백슬래시로 이스케이프된다는 점에 유의하세요.
귀하의 명령은 다음을 모방하지 않습니다.
$ printf '%s\n' "$(pv "$file" | sha256sum | sed 's/-$//')$file"
f6c94d35691b9c356f7e5072f94d23f127b168cf9b04f0f5b26e0cb1f6ef4414 wo\rds