POSIX-ly 후행 텍스트 교체

POSIX-ly 후행 텍스트 교체

왜냐하면 파일 이름을 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

관련 정보