例子

例子

当我使用时,自动完成文件名(在TAB写完文件名的第一个字符后按下)在我的 Ubuntu 13.04 框和我的 Debian Squeeze 框上都是区分大小写的scp

我的中有以下几行.inputrc

set completion-ignore-case on

并且不区分大小写的自动完成功能在其他 shell 程序上运行良好。

例子

<TAB>这里的意思是按下TAB键。

正确的行为

目前,不区分大小写的自动完成功能在其他 shell 程序上可以正常工作,例如cp这里:

$ cp my<TAB>

正如预期,结果如下:

$ cp MyFile

不正确的行为

使用 时scp,不区分大小写的自动完成功能不起作用。在此行中,什么也没有发生:

$ scp my<TAB>

而且我必须恢复使用繁琐的区分大小写的自动完成功能,如下所示:

$ scp My<TAB>

正如预期,结果如下:

$ scp MyFile

可能的解决方法

由于这是一个“最近”的问题(即这只发生了几年左右),我猜测这与某些程序从某些版本开始具有自动完成开关和其他参数的方式有关,bash但我无法找到如何解决这个特定问题。

答案1

Debian(和 Ubuntu)安装为您提供了大量的 shell 完成功能(在bash-completion包中);这些功能存储在目录中/etc/bash_completion.d,您感兴趣的是/etc/bash_completion.d/ssh

据我所知,脚本获取可能完成的列表的方式是发出命令ls -aFld ${path}*,其中${path}是需要完成的单词,可以在远程机器上(使用 ssh)或直接在本地机器上。

为了使其以不区分大小写的方式工作,您需要安排在ls远程系统上执行的命令中的 glob 不区分大小写地扩展,这意味着您需要在执行命令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' \

相关内容