研究

研究

我有一个需要密码的命令行。密码以字符“!1”开头。例如 '!1x9y377s' 。如果我使用该密码执行命令,则会发生历史记录扩展,并且前两个字母“!1”将被第一个历史记录条目替换。例如

ll
...list entries
echo !1x9y377s
llx9y377s

但我想要的是:

ll
...list entries
echo !1x9y377s
!1x9y377s

研究

我很快意识到这是在 bash 解析之前发生的历史扩展。我搜索:如何阻止命令行中传递的密码发生历史扩展?这导致了这样的事情:

  1. 超级用户
  2. 叠加
  3. 伯克利 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 单引号

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

相关内容