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

3

Eu estou escrevendo um Dockerfileque estou formatando usando guias (que eu costumo usar em todos os lugares).

Mas copiei um comando de várias linhas onde 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 "autocompletar", mostra todos os comandos possíveis e, em seguida:

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

Eu entendo o comportamento "autocompletar", mas stall collectd? Por que Bash come a apt-get -y inparte?

lucasvc
fonte

Respostas:

3

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

Se você fosse digitar duas abas, Bash perguntaria se você quer,

Exibindo todas as 5177 possibilidades? (y ou n)?

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

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

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

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

Anthony Geoghegan
fonte
5

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

bind 'set disable-completion on'

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

Para reativar o tabuso da chave:

bind 'set disable-completion off'
caos
fonte
Você pode explicar por que não podemos simplesmente entrar set disable-completion offno shell / porque eu tenho que passá-lo como uma string para o bindcomando?
Luke Davis