Copie e cole aqui o documento no Bash converte guias em pontos

Copie e cole aqui o documento no Bash converte guias em pontos

Eu uso o Windows 10 home (compilação 16299.248) e estou fazendo SSH em uma máquina Ubuntu 16.04 remota com vários clientes SSH (como Putty/MobaXterm).

Copio e colo o seguinte código da minha conta pessoal do GitHub em uma sessão SSH:

cat <<-EOF >> "$HOME"/.bashrc
    export s_a="/etc/nginx/sites-available"
    export s_e="/etc/nginx/sites-enabled"
    export drt="/var/www/html"
    source "$HOME"/"$repo"/software_internal.sh
EOF

eu copiodiretamente da minha conta GitHub aqui (versão não bruta)embora o seguinte problema aconteça mesmo se eu copiar da versão bruta do GitHub.

Meu problema

O resultado no Bash remoto é este:

> .export s_a="/etc/nginx/sites-available"
> .export s_e="/etc/nginx/sites-enabled"
> .export drt="/var/www/html"
> .source "$HOME"/"$repo"/software_internal.sh
> EOF

Observe o único ponto no início de quase cada linha.

Algo está traduzindo tabulações em pontos únicos.

Fatos

  • O problema que acabei de descrever acontece com vários tipos de clientes SSH.

  • As pessoas também conseguiram replicar o problema em sistemas Linux (Debian, Ubuntu), além disso, se eu usar o Subsistema Windows 10 para Linux (WSL) não tenho os pontos (seja do Powershell ou do CMD). Também não uso gerenciadores de área de transferência/área de transferência de qualquer tipo no Windows 10.

  • Também não há evidências de que o GitHub esteja usando qualquer caractere de tabulação não convencional.

  • Acontece quando copio do Mozilla Firefox ou do Google Chrome.

  • Não mudei nada no DigitalOcean Ubuntu Bash depois de instalá-lo (depois de criar meu "droplet" na terminologia DigitalOcean).

Isso parece ser um bug no GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu). Consegui replicar o bug no Debian stable 9.3 com Bash 5.2 também. No entanto, este problema não acontece no Arch, então é provável que seja exclusivo das distribuições Debian.

Outras informações

O problema acontece não apenas no DigitalOcean, mas também no Linode - um engenheiro da Linode conseguiu reproduzir isso no Ubuntu 14.04, 16.04 e 17.04.

É possível que DigitalOcean e Linode personalizem o Ubuntu da mesma maneira e o bug não esteja no Bash, mas ainda seja exclusivo do DigitalOcean e Linode.

Resumo

É extremamente improvável que o problema acima venha do Windows 10, clientes SSH, GUI do GitHub ou navegadores da web; É provável que venha de repositórios Debian, Bash em 4.3/5.2/outro, ou da combinação Debian-Bash.

Minha pergunta

Qual é a maneira certa de lidar com esse problema? É claro que eu poderia excluir as guias do documento aqui, mas é definitivamente algo que não quero. As abas me ajudam a organizar melhor o documento aqui.

Responder1

Bash está completando o nome do arquivo dentro do heredoc. Seu diretório não temnão ocultoarquivos (arquivos que não começam com '.'), então o mais longosubstringO número de caracteres que corresponde ao início de todos os nomes de arquivos no diretório é '.', e é isso que é fornecido e deixado em sua entrada.

A mesma versão do Bash exibe esse comportamento em todos os lugares que experimentei, portanto, claramente não está limitado a um provedor VPS específico. Não consegui parar sem desabilitar completamente a conclusão (então não posso fornecer um "Aqui está o que Linode precisa fazer para corrigir a imagem da distribuição"), mas existem algumas soluções alternativas para seu uso específico:

  1. A solução mais fácil, sem alterar nada no próprio Bash, é criar umnão ocultoarquivo no diretório ( $HOME), antes do heredoc iniciar. Isso fará com que a conclusão do nome do arquivo corresponda a 0 caracteres. Você poderia fazer isso com say touch "$HOME"/myFile.

  2. Inicie um shell com readline desabilitado e faça o que quiser lá.bash --noediting

  3. Desative a conclusão antes do heredoc:bind 'set disable-completion on'

informação relacionada