粘贴以制表符开头的 Bash 命令时完成

粘贴以制表符开头的 Bash 命令时完成

我正在编写一个Dockerfile使用制表符(我通常在任何地方都使用制表符)进行格式化的代码。

但是我复制了一个多行命令,其中第二行以两个制表符开头,即:

apt-get -y update && \
    apt-get -y install collectd \ # begin two tabs

第一行执行正确,但第二行尝试“自动完成”,显示所有可能的命令,然后:

> stall collectd
# [ apt-get updating ]
bash: stall: command not found

我理解“自动完成”的行为,但是stall collectd?为什么 Bash 会吃掉该apt-get -y in部分?

答案1

Chaos 的回答清楚地解释了如何禁用这种行为,但我将这个问题解释为出于对命令第一部分发生的事情的好奇apt-get

如果你输入两个 tab,Bash 会询问你是否要

显示全部 5177 种可能性?(y 或 n)?

请注意,可能性的数量取决于您自己的环境。

如果您使用字符串中的任何字符进行回复apt-get -,Bash 都会忽略它们,因为它只需要是或否。当它得到时y,它会显示所有可能性。

在 Bash 的现代版本中,此列表显示在分页器中,分页器More?底部有一个提示符。分页器使用空格字符向下滚动一页,忽略后面的i字符,但下一个字符n被解释为“否”以退出分页器。

最后,剩下的字符stall collectd被shell解释为命令。

答案2

bash您可以禁用按下按键时的完成行为tab

bind 'set disable-completion on'

现在,该tab键只会像在编辑器中一样缩进行。这只是暂时的。在下一个 shell 会话中它尚未设置。如果您想使它永久生效,请将其添加到您的~/.inputrc.

要重新启用tab密钥,请使用:

bind 'set disable-completion off'

相关内容