我正在编写一个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'