A linha de comando scp não usa o preenchimento automático sem distinção entre maiúsculas e minúsculas

0

Os nomes de arquivos com preenchimento automático (pressionando TAB depois que os primeiros caracteres dos nomes dos arquivos foram gravados) fazem distinção entre maiúsculas e minúsculas na minha caixa do Ubuntu 13.04 e na minha caixa do Squeeze, quando eu uso scp .

Eu tenho a seguinte linha no meu .inputrc :

set completion-ignore-case on

e o autocompletar sem distinção entre maiúsculas e minúsculas funciona bem em outros programas shell.

Exemplos

<TAB> aqui significa pressionar a tecla TAB .

Comportamento correto

Atualmente, o preenchimento automático não diferencia maiúsculas de minúsculas funciona corretamente em outros programas shell, como cp here:

$ cp my<TAB>

que produz, como esperado:

$ cp MyFile

Comportamento incorreto

Ao usar scp , a autocompletar não diferencia maiúsculas de minúsculas não funciona. Nesta linha, nada acontece:

$ scp my<TAB>

E eu tenho que voltar a usar o autocomplexo entediante e sensível a maiúsculas, como aqui:

$ scp My<TAB>

que produz, como esperado:

$ scp MyFile

Possível solução alternativa

Como este é um problema "recente" (ou seja, isso vem acontecendo há apenas alguns anos), meu palpite é que isso tem algo a ver com a maneira como alguns programas têm comutadores de preenchimento automático e outros argumentos, a partir de alguns versão de bash , mas não consigo descobrir como corrigir esse problema específico.

    
por miikkas 17.09.2013 / 19:30

1 resposta

4

A instalação Debian (e Ubuntu) fornece uma série de funções de conclusão do shell (no pacote bash-completion ); as funções são armazenadas no diretório /etc/bash_completion.d e a que você está interessado é /etc/bash_completion.d/ssh .

Tanto quanto eu posso ver, a maneira que o script obtém a lista de possíveis conclusões é emitir o comando ls -aFld ${path}* , onde ${path} é a palavra que precisa ser concluída, seja na máquina remota - usando ssh - - ou diretamente na máquina local.

Para que isso funcione de maneira que não diferencia maiúsculas de minúsculas, é necessário organizar o glob nesse comando ls em execução no sistema remoto para ser expandido sem distinção entre maiúsculas e minúsculas, o que significa que você deseja shopt -s nocaseglob antes o comando ls é executado.

Eu acho que seu ubuntu / debian é mais recente do que o meu, mas é possível que o seguinte patch funcione em seu sistema. Caso contrário, você provavelmente poderá descobrir a edição necessária:

--- ssh.old     2013-09-17 16:07:38.000000000 -0500
+++ ssh         2013-09-17 16:06:25.000000000 -0500
@@ -275,3 +275,3 @@
         files=$( ssh -o 'Batchmode yes' $userhost \
-            command ls -aF1d "$path*" 2>/dev/null | \
+            builtin shopt -s nocaseglob ';' command ls -aF1d "$path*" 2>/dev/null | \
             sed -e 's/'$_scp_path_esc'/\\\&/g' -e '/[^\/]$/d' )
@@ -281,3 +281,3 @@
         files=$( ssh -o 'Batchmode yes' $userhost \
-            command ls -aF1d "$path*" 2>/dev/null | \
+            builtin shopt -s nocaseglob ';' command ls -aF1d "$path*" 2>/dev/null | \
             sed -e 's/'$_scp_path_esc'/\\\&/g' -e 's/[*@|=]$//g' \
@@ -303,6 +303,6 @@
     if $dirsonly ; then
-        COMPREPLY=( "${COMPREPLY[@]}" $( command ls -aF1d $cur* 2>/dev/null | \
+        COMPREPLY=( "${COMPREPLY[@]}" $( shopt -s nocaseglob; command ls -aF1d $cur* 2>/dev/null | \
             sed -e "s/$_scp_path_esc/\\&/g" -e '/[^\/]$/d' -e "s/^/$1/") )
     else
-        COMPREPLY=( "${COMPREPLY[@]}" $( command ls -aF1d $cur* 2>/dev/null | \
+        COMPREPLY=( "${COMPREPLY[@]}" $( shopt -s nocaseglob; command ls -aF1d $cur* 2>/dev/null | \
             sed -e "s/$_scp_path_esc/\\&/g" -e 's/[*@|=]$//g' \
    
por 17.09.2013 / 21:13

Tags