Bash 스크립트에서 파일 해시를 비교하는 방법은 무엇입니까?

Bash 스크립트에서 파일 해시를 비교하는 방법은 무엇입니까?

sha256sumbash 스크립트에서 파일이 변경되었는지 확인하는 데 사용합니다 . 내 생각은 sha256sum먼저 파일에 저장하는 것입니다 *.sha256. 그런 다음 존재하는 경우 명령을 사용하여 sha256비교에 사용합니다 --check. 해시가 일치하면 나머지 스크립트를 계속 진행하고, 그렇지 않으면 새 해시 파일( *.sha256)을 만들고 이전 해시 파일을 새 파일로 바꿉니다. 나는 이미 이 작업을 수행했습니다.

x="/home/test.json"

if [[ -s $x.sha256 ]]; then
        sha256sum --check $x.sha256
        #exit 1
        s1=$(sha256sum "$x" > "$x.sha256")
        #exit 1
else
        s1=$(sha256sum "$x" > "$x.sha256")
        echo "sha256 file is created"
fi

하지만 위의 코드부터 x.sha256 파일이 존재하지 않으면 생성됩니다. 그러나 파일이 이미 사용 가능하고 해시가 일치하지 않으면 오류가 발생합니다.

/home/test.json: FAILED
sha256sum: WARNING: 1 computed checksum did NOT match

이는 예상된 사항이지만 이 경우 새 파일을 만들고 이전 파일을 교체하고 싶습니다 x.sha256.

어떤 변경이 필요한지 말해 줄 수 있는 사람이 있나요?

미리 감사드립니다

답변1

댓글에서:

그러나 스크립트는set -Eeo pipefail

set -efalse 상태 로 종료하면 sha256sum --check전체 스크립트가 실패하게 됩니다. 이를 방지하려면 run 과 같은 모든 종류의 조건에 명령을 입력하세요 sha256sum --check || true instead.

또한 언급한 대로 출력이 파일로 리디렉션되고 명령 대체에 캡처할 항목이 없으며 무슨 일이 있어도 결과가 비어 있기 때문에 s1=$(sha256sum "$x" > "$x.sha256")뭔가 이상해 보입니다 . 필요하지 않은 경우 명령 대체를 제거하고 출력을 변수와 파일에 저장하려면 다음과 같은 것을 사용하십시오.sha256sum$s1s1sha256sum

s1=$(sha256sum "$x" | tee "$x.sha256")

그래서 전체 스크립트를 다음과 같이 다시 작성하겠습니다.

#!/bin/bash

set -e
file="/home/test.json"

if [[ -s $file.sha256 ]]; then
    if ! sha256sum --check "$file.sha256"; then
        echo "stored hash for '$file' does not match existing file, storing new hash"
        sha256sum "$file" > "$file.sha256"
    else
        : # hash file exists and matches existing file, do nothing
    fi
else
    echo "no stored hash for '$file', creating hash file"
    sha256sum "$file" > "$file.sha256"
fi

즉, 파일에 해시의 추가 복사본이 필요하지 않는 한, 이 경우 기존 일치 해시 분기에서도 읽어야 합니다 "$file.sha256".

하지만 당신이 set -e사용하는 경우BashFAQ/105 -- -e를 설정(또는 -o errexit 또는 트랩 ERR을 설정)해도 예상한 대로 작동하지 않는 이유는 무엇입니까?

관련 정보