Автозаполнение имен файлов (нажатием клавиши TAB после того, как были написаны первые символы имен файлов) чувствительно к регистру как в моем Ubuntu 13.04, так и в моем Debian Squeeze, когда я использую scp .

У меня есть следующая строка в моем .inputrc:

set completion-ignore-case on

и автозаполнение без учета регистра прекрасно работает в других программах оболочки.

Примеры

<TAB> здесь означает нажатие клавиши TAB .

Правильное поведение

В настоящее время автозаполнение без учета регистра корректно работает в других программах оболочки, таких как cp здесь:

$ cp my<TAB>

что дает, как и ожидалось:

$ cp MyFile

Неправильное поведение

При использовании scp автозаполнение без учета регистра не работает. На этой линии ничего не происходит:

$ scp my<TAB>

И я должен вернуться к использованию утомительного автозаполнения с учетом регистра, как здесь:

$ scp My<TAB>

что дает, как и ожидалось:

$ scp MyFile

Возможное решение

Поскольку это "недавняя" проблема (т. Е. Это происходило всего несколько лет или около того), я предполагаю, что это как-то связано с тем, что некоторые программы имеют переключатели автозаполнения и другие аргументы, начиная с некоторой версии bash , но я не могу узнать, как решить эту конкретную проблему.

1 ответ1

4

Установка Debian (и Ubuntu) предоставляет вам множество функций завершения оболочки (в пакете bash-completion ); функции хранятся в каталоге /etc/bash_completion.d а интересующий вас файл - /etc/bash_completion.d/ssh .

Насколько я вижу, сценарий получает список возможных завершений, выполняя команду ls -aFld ${path}* , где ${path} - это слово, которое нужно завершить, либо на удаленной машине - используя ssh - или напрямую на локальной машине.

Для того, чтобы это работало без учета регистра, вам нужно организовать, чтобы глобус в этой команде ls выполняемой на удаленной системе, расширялся без учета регистра, что означает, что вы хотите shopt -s nocaseglob до того, как команда ls будет казнены.

Я думаю, что ваш Ubuntu / Debian более поздний, чем мой, но возможно, что следующий патч будет работать на вашей системе. В противном случае, вы, вероятно, сможете найти необходимые изменения:

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .