Isso tem a ver com o modo como a conclusão do bash funciona e a maneira como o cifs funciona como um protocolo.
A conclusão do bash funciona assim:
- readline informa o bash da string atualmente digitada e do pressionamento de tecla da guia. O
- bash realiza uma Depth First Search do sistema de arquivos, cuja raiz está na parte mais correspondente da hierarquia do sistema de arquivos. Cada etapa dessa pesquisa é, na verdade, muitas solicitações - uma solicitação de lista - do sistema de arquivos.
- blocos readline - aguardando uma resposta do bash com uma lista de possíveis resultados a serem exibidos.
- essa lista chega, readline a exibe e retorna o controle de entrada para o usuário.
Em um nível de bloco ou sistema de arquivos local ou razoavelmente rápido, tudo isso acontece incrivelmente rápido.
O CIFS, infelizmente, não é um sistema de arquivos de nível de bloco. Em vez disso, o CIFS é um protocolo transacional baseado em comando. Cada pedido feito contra o CIFS é:
- transacional, exigindo uma solicitação, reconhecimento e confirmação da confirmação,
- representado por vários blocos de comandos CIFS / SMB individuais
- inspecionado para autenticação
Em suma, CIFS / SMB é (pelo menos em SMB1, que quase seguramente é o que você está usando para montar este compartilhamento CIFS) extremamente falador.
No uso comum e direto de nomes de arquivos conhecidos, a solicitação é um singleton. Você faz a solicitação de um arquivo, o CIFS o autentica, reconhece sua solicitação, você confirma seu reconhecimento e suas transferências de arquivos.
No caso de conclusão de tabulação, esse ciclo é multiplicado pelo número de arquivos em um diretório específico, possivelmente duas vezes (ou mais!) se estiver desreferenciando um atalho do Windows.
em toda a rede.
Esta é uma receita para lentidões significativas, pois readline espera por bash, que, por sua vez, aguarda que o driver do sistema de arquivos negocie com o servidor CIFS.
Você pode resolver esse problema fazendo coisas como executar sua sessão de dentro de screen
, assim, se a sua sessão bash trava, você pode ctrl-A-c
e receber o novo terminal, para continuar para trabalhar ou até mesmo matar o outro.