La riga di comando scp non utilizza il completamento automatico senza distinzione tra maiuscole e minuscole


0

Il completamento automatico dei nomi dei file (premendo TABdopo che sono stati scritti i primi caratteri dei nomi dei file) fa distinzione tra maiuscole e minuscole sia sulla mia casella Ubuntu 13.04 che sulla mia casella Debian Squeeze, quando uso scp.

Ho la seguente riga nel mio .inputrc:

set completion-ignore-case on

e il completamento automatico senza distinzione tra maiuscole e minuscole funziona bene su altri programmi di shell.

Esempi

<TAB>qui significa premere il TABtasto.

Comportamento corretto

Attualmente, il completamento automatico senza distinzione tra maiuscole e minuscole funziona correttamente su altri programmi shell, come cpqui:

$ cp my<TAB>

che produce, come previsto:

$ cp MyFile

Comportamento errato

Durante l'utilizzo scp, il completamento automatico senza distinzione tra maiuscole e minuscole non funziona. Su questa linea, non succede nulla:

$ scp my<TAB>

E devo tornare a utilizzare il noioso completamento automatico maiuscolo / minuscolo, come qui:

$ scp My<TAB>

che produce, come previsto:

$ scp MyFile

Possibile soluzione alternativa

Poiché si tratta di un problema "recente" (ovvero è successo solo da alcuni anni), la mia ipotesi è che ciò abbia a che fare con il modo in cui alcuni programmi hanno opzioni autocompilabili e altri argomenti, a partire da una versione di bash, ma non riesco a scoprire come risolvere questo problema specifico.


Sono un po 'confuso dalla tua domanda. Si menziona SCP e il completamento della scheda, ma in generale, il completamento della scheda viene gestito localmente. Puoi chiarire dove ti aspetti che il completamento della scheda non faccia distinzione tra maiuscole e minuscole e dove sia attualmente e non sia sensibile al maiuscolo / minuscolo?
Ernie,

@ernie: ho aggiunto alcuni esempi.
miikkas,

Risposte:


4

L'installazione di Debian (e Ubuntu) fornisce una montagna di funzioni di completamento della shell (nel bash-completionpacchetto); le funzioni sono memorizzate nella directory /etc/bash_completion.de quella a cui sei interessato è /etc/bash_completion.d/ssh.

Per quanto posso vedere, il modo in cui lo script ottiene l'elenco dei possibili completamenti è emettere il comando ls -aFld ${path}*, dove ${path}è la parola che deve essere completata, sul computer remoto - usando ssh - o direttamente sul computer locale.

Affinché ciò funzioni senza distinzione tra maiuscole e minuscole, è necessario disporre che il glob in quel lscomando in esecuzione sul sistema remoto sia espanso senza distinzione tra maiuscole e minuscole, il che significa che si desidera farlo shopt -s nocaseglobprima lsdell'esecuzione del comando.

Penso che il tuo ubuntu / debian sia più recente del mio, ma è possibile che la seguente patch funzioni sul tuo sistema. Altrimenti, probabilmente puoi capire la modifica necessaria:

--- 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' \

scp non esegue il completamento degli articoli sul computer remoto. . .
Ernie,

@ernie: scp no, no. Lo fa uno script bash (se lo hai installato).
rici,

Avevo iniziato a scrivere una risposta seguendo le stesse linee, ma poi ho scoperto che non avevo /etc/bash_completion/ssh(o qualsiasi altra cosa che potesse essere rilevante, come scp) sul mio Debian (LMDE) e che tuttavia potesse riprodurre i sintomi del PO. Se hai un /etc/bash_completion/ssh, quale distribuzione stai usando? Penso che questo sia qualcosa di diverso e scpcompia un diverso tipo di completamento poiché mette anche in evidenza i nomi dal /etc/hostsfile. +1 comunque per una buona risposta!
terdon,

@terdon: è /etc/bash_completion.d/ssh e sto usando Ubuntu 12.04. È un pacchetto debian chiamato bash-completion. Non so quale altro meccanismo avrebbe la tua distribuzione, ma le funzioni di completamento sono visibili se digiti set, quindi puoi probabilmente trovare da dove vengono caricate. Ho trovato una funzione chiamata _known_hosts_realin /etc/bash_completioncui si trovano vari file di configurazione SSH per host noti, ma bash sa già come guardare attraverso / etc / hosts: provarecompgen -A hostname
rici,

Il file che ho dovuto modificare su Ubuntu 13.04 era /usr/share/bash-completion/completions/scp, dopo di che il tuo suggerimento ha funzionato come un fascino. Grazie per la magnifica risposta!
Mikikas,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.