gpg 배치 모드를 사용하여 스크립트에서 파일의 암호를 해독하려고 하는데 비밀번호에 "!"가 포함되어 있어 명령이 실행되지 않습니다.
echo "m!pass"|gpg --batch --passphrase-fd 0 --decrypt-file plain.gpg
bash: !pass": event not found
또는
gpg --batch --passphrase "m!pass" -d plain.gpg
bash: !pass": event not found
나는 bash가 느낌표를 명령 실행 기록에 대한 참조로 해석하고 있다고 생각합니다. GPG 배치 모드에서 올바른 방법은 무엇입니까?
답변1
큰따옴표 대신 작은따옴표를 사용하세요.
$ echo "m!pass"
bash: !pass": event not found
$ echo 'm!pass'
m!pass
이것은배쉬 매뉴얼(강조하다):
아포스트로피
작은따옴표(''')로 문자를 묶으면 따옴표 안의 각 문자의 리터럴 값이 유지됩니다. 앞에 백슬래시가 있더라도 작은따옴표 사이에는 작은따옴표를 사용할 수 없습니다.
큰따옴표
문자를 큰따옴표('"')로 묶으면 큰따옴표 내에서
’, ‘\’, and, when history expansion is enabled, ‘!’. The characters ‘$’ and ‘
특별한 의미를 유지하는 '$'를 제외하고 큰따옴표 안에 있는 모든 문자의 리터럴 값이 유지됩니다(쉘 확장 참조). 백슬래시는 뒤에 하나가 올 때만 특별한 의미를 유지합니다. 다음 문자 중 하나: '$', '`', '"', '\' 또는 개행 문자. 큰따옴표 내에서 이러한 문자 중 하나 뒤에 오는 백슬래시가 제거됩니다. 특별한 의미가 없는 선행 백슬래시 문자는 변경되지 않습니다. 큰따옴표 앞에 백슬래시를 추가하면 큰따옴표 안에 큰따옴표를 넣을 수 있습니다.활성화되면 "!"가 큰따옴표 안에 표시되고 백슬래시로 이스케이프되지 않는 한 기록 확장이 수행됩니다.앞에 있는 '!'의 백슬래시는 제거되지 않습니다.
답변2
내가 선호하는 접근 방식은 들어본 적도 없고, 원한 적도 없고, 아마도 지금은 알고 있더라도 아마 절대 사용하지 않을 어리석은 기록 확장 기능을 비활성화하는 것입니다.
$ echo "hello!"
bash: !": event not found
$ set +o histexpand
$ echo "hello!"
hello!