我有一个需要密码的命令行。密码以字符“!1”开头。例如 '!1x9y377s' 。如果我使用该密码执行命令,则会发生历史记录扩展,并且前两个字母“!1”将被第一个历史记录条目替换。例如
ll
...list entries
echo !1x9y377s
llx9y377s
但我想要的是:
ll
...list entries
echo !1x9y377s
!1x9y377s
研究
我很快意识到这是在 bash 解析之前发生的历史扩展。我搜索:如何阻止命令行中传递的密码发生历史扩展?这导致了这样的事情:
- 超级用户
- 叠加
- 伯克利 tcsh 文档 它指出:“‘!’前面可以有一个“\”以防止其特殊含义”
我尝试执行:
ll
...list entries
echo '!1x9y377s'
!1x9y377s
和
ll
...list entries
echo \!1x9y377s
!1x9y377s
两者都有效。
答案1
有两种方法可以解决这个问题。根据伯克利文档:“The!
前面可以有 a\
以防止其特殊含义”
但是,如果您不想转义,请在密码周围使用单引号。例如
ll
...list entries
echo '!1x9y377s'
!1x9y377s
根据 Bash 手册: 3.1.2.2 单引号
将字符括在单引号 (') 中可保留引号内每个字符的字面值。单引号之间不能出现单引号,即使前面有反斜杠也是如此。