sha256sum
bash 스크립트에서 파일이 변경되었는지 확인하는 데 사용합니다 . 내 생각은 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 -e
false 상태 로 종료하면 sha256sum --check
전체 스크립트가 실패하게 됩니다. 이를 방지하려면 run 과 같은 모든 종류의 조건에 명령을 입력하세요 sha256sum --check || true instead
.
또한 언급한 대로 출력이 파일로 리디렉션되고 명령 대체에 캡처할 항목이 없으며 무슨 일이 있어도 결과가 비어 있기 때문에 s1=$(sha256sum "$x" > "$x.sha256")
뭔가 이상해 보입니다 . 필요하지 않은 경우 명령 대체를 제거하고 출력을 변수와 파일에 저장하려면 다음과 같은 것을 사용하십시오.sha256sum
$s1
s1
sha256sum
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을 설정)해도 예상한 대로 작동하지 않는 이유는 무엇입니까?