当密码短语包含“!”时,以批处理模式使用 gpg 解密文件?

alt*_*as5 3 bash quoting gpg

我正在尝试使用 gpg 批处理模式解密脚本中的文件,但未执行命令,因为密码短语包含“!”

echo "m!pass"|gpg --batch --passphrase-fd 0 --decrypt-file plain.gpg
bash: !pass": event not found
Run Code Online (Sandbox Code Playgroud)

或者

gpg --batch --passphrase "m!pass" -d plain.gpg 
bash: !pass": event not found
Run Code Online (Sandbox Code Playgroud)

我猜 bash 将感叹号解释为对命令执行历史的引用。在 GPG 批处理模式下,哪种方法是正确的?

ter*_*don 6

使用单引号代替双引号:

$ echo "m!pass"
bash: !pass": event not found
$ echo 'm!pass'
m!pass
Run Code Online (Sandbox Code Playgroud)

这在bash 手册中有很好的解释(强调):

单引号

将字符括在单引号 (''') 中会保留引号内每个字符的字面值。单引号之间不能出现单引号,即使前面有反斜杠。

双引号

用双引号 ('"') 括起来的字符会保留引号内所有字符的字面值,但 '$' 除外,' ’, ‘\’, and, when history expansion is enabled, ‘!’. The characters ‘$’ and ‘' 保留它们在双引号内的特殊含义(请参阅 Shell Expansions)。反斜杠保留其特殊含义仅当后跟以下字符之一时:'$'、'`'、'"'、'\' 或换行符。在双引号内,后跟这些字符之一的反斜杠将被删除。没有特殊含义的字符前面的反斜杠保持不变。双引号可以通过在双引号前面加上反斜杠来引用。如果启用,将执行历史扩展,除非'!' 出现在双引号中的是使用反斜杠进行转义。'!' 前面的反斜杠 没有被移除。