如何让bash自动完成通配符?


10

如果我有包含文件的目录

foo.bar.a.cat
foo.bar.a.hat

然后我输入ls f+ TABbash shell自动完成ls foo.bar.a.。如果输入ls *bar*+,TAB我希望它自动完成*bar*.a.。这可能吗?

这看起来类似于问题

如何在bash中启用通配符的制表符完成?

但是建议的答案“它对我来说是开箱即用的”,却没有。我也尝试过TAB TAB,没有效果。命令``bash --version givesGNU bash,4.2.37(1)-release(x86_64-pc-linux-gnu)`。

Answers:


14

您想要:

插入完成

ALT* 用于“插入所有完成内容”

这样,包含文件名“ aa ab ac ad”
ls a*的目录alt + *将紧随其后ls aa ab ac ad

关于绑定的手册页条目:

插入补全(M- *)

在可能的补全可能产生的点之前插入所有文本补全。

全局扩展词

在某些系统上,以上不适用于通配符,以下对我而言适用于此类系统:

ctrlx*(两个笔划组合)

示例:我用以下命令填充目录:

touch {a,b,c,d,e,f}{1,2,3,4,5,6,7,8,9,0}00{a,b,c,d,f,e}

然后,ls *100*接着是ctrl + x, *,这会将我的阅读行变成:

ls a100a a100b a100c a100d a100e a100f b100a b100b b100c b100d b100e b100f c100a c100b c100c c100d c100e c100f d100a d100b d100c d100d d100e d100f e100a e100b e100c e100d e100e e100f f100a f100b f100c f100d f100e f100f

用于绑定的手册页条目:

全局扩展字(Cx *)

point之前的单词被视为路径名扩展的模式,并且插入了匹配文件名列表,以替换该单词。如果提供了数字参数,则在路径名扩展之前会附加一个“ *”。

手册页


这不起作用(至少对我而言)。创建文件touch aa ab ac ad并键入,ls a然后alt+*给出列表,但这样做ls a*不会。通配符是问题的重点。
上钩

@Hooked这对我有效GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)GNU bash, version 4.2.0(1)-release (x86_64--netbsd)但无效GNU bash, version 4.2.45(2)-release (i386-apple-darwin12.2.0)。通过工作,我的意思是将其归档在案文中。将检查我的配置文件,看我是否还有其他东西。
娴静的

真奇怪,为什么这么简单的事情会在版本之间变化?关于如何启用它或在​​编译时内置的任何想法?
上钩

@Hooked我有点困惑太......也对我的树莓派失败GNU bash, version 4.2.37(1)-release (arm-unknown-linux-gnueabihf)(raspbian)
娴静

@Hooked找到了替代绑定,对我来说,该绑定在第一个没有的系统上有效。
娴静,

8

尝试将其添加到〜/ .inputrc中:

set show-all-if-ambiguous on

如果模棱两可,则全部显示使按一次Tab键(而不是两次)列出所有补全。它还使第一个选项卡按下时插入全局表达式的共享前缀。

$ touch 1.0.{1,2}
$ echo *0* # I pressed tab once here
1.0.1  1.0.2
$ echo 1.0.

glob-complete-word(\ eg)也将完成*0(没有*结尾)1.0.。例如/System/Library/Launch*/*Finde,它也完成了/System/Library/LaunchAgents/com.apple.Finder.plist

如果*1.0.1 1.0.2在上面的示例中转换为,请使用插入补全(\ e *)或glob扩展字(\ Cx *)。


4

此问题是由“ bash-completion”包中的错误引起的。

当未安装该软件包时,bash会默认完成,这是一个很好的通用文件名完成引擎。

“ bash-completion”程序包应该查看该行的其余部分,并对其生成的列表“保持精明”。但是,它无法成功复制“全局”扩展。

就我个人而言,我认为该程序包太过努力,最终只能由“最愚蠢的普通用户”使用。

但是,在删除它之前,您可能需要检查文件“ / usr / share / bash-completion / bash_completion”的顶部,以获取对.bashrc的有用添加,以对内置bash补全进行“粗调”。

顺便说一句:它已经记录了一百多个错误... https://bugs.debian.org/cgi-bin/pkgreport.cgi?package=bash-completion


$ sudo yum delete bash-completion#为我解决了这个问题
user2449151
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.