Conclusão ao colar o comando Bash começando com guias

Conclusão ao colar o comando Bash começando com guias

Estou escrevendo um Dockerfileque estou formatando usando abas (que costumo usar em qualquer lugar).

Mas copiei um comando de várias linhas em que a segunda linha começa com dois caracteres de tabulação, ou seja:

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

A primeira linha é executada corretamente, mas a segunda linha tenta "preencher automaticamente", mostrar todos os comandos possíveis e então:

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

Eu entendo o comportamento de "preenchimento automático", mas stall collectd? Por que Bash come a apt-get -y inparte?

Responder1

A resposta do caosexplica claramente como desabilitar esse comportamento, mas interpretei essa pergunta como sendo motivada pela curiosidade sobre o que aconteceu com a primeira parte do apt-getcomando:

Se você digitasse duas guias, o Bash perguntaria se você deseja,

Exibir todas as 5177 possibilidades? (s ou n)?

Observe que o número de possibilidades depende do seu próprio ambiente.

Se você respondesse com qualquer um dos caracteres da string apt-get -, o Bash os ignoraria, pois só quer um sim ou um não. Quando obtém o y, exibe todas as possibilidades.

Nas versões modernas do Bash, esta lista é exibida em um pager que possui um More?prompt na parte inferior. O pager usa o caractere de espaço para rolar uma página para baixo, ignora o seguinte, imas o próximo caractere né interpretado como “Não” para sair do pager.

Finalmente, os caracteres restantes stall collectdsão interpretados pelo shell como um comando.

Responder2

Você pode desativar o comportamento de conclusão bashao pressionar a tabtecla:

bind 'set disable-completion on'

Agora, a tabchave apenas recua a linha como dentro de um editor. Isto é apenas temporário. Na próxima sessão do shell, ele não está definido. Se você quiser torná-lo permanente, adicione-o ao seu arquivo ~/.inputrc.

Para reativar o tabuso da chave:

bind 'set disable-completion off'

informação relacionada