我正在尝试使用 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 批处理模式下,哪种方法是正确的?
使用单引号代替双引号:
$ 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)。反斜杠保留其特殊含义仅当后跟以下字符之一时:'$'、'`'、'"'、'\' 或换行符。在双引号内,后跟这些字符之一的反斜杠将被删除。没有特殊含义的字符前面的反斜杠保持不变。双引号可以通过在双引号前面加上反斜杠来引用。如果启用,将执行历史扩展,除非'!' 出现在双引号中的是使用反斜杠进行转义。'!' 前面的反斜杠 没有被移除。
| 归档时间: |
|
| 查看次数: |
7253 次 |
| 最近记录: |