当我使用时,自动完成文件名(在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' \