Bash:将TAB完成列表作为列表

时间:2015-07-09 10:21:18

标签: bash autocomplete

我想知道一种方法来获取命令的可能完成列表但不执行它。例如,要获取可加载的linux模块列表,您可以执行以下操作:

$ sudo modprobe [TAB][TAB]
... list of completions

但是,如果想要在文件中“保存”该列表怎么办?我认为为此目的应该有complete命令的任何选项:

$ complete <whanever option> modprobe > modprobe-completion-list.txt

或者,对于部分完成:

$ complete <whanever options> "modprobe i2" > modules-prefix-i2-list.txt

2 个答案:

答案 0 :(得分:3)

通常这样做的正常方法是compgen。但是如果你使用标准的bash-completions,那么modprobe的情况将不起作用,因为它通过shell函数调用。虽然compgen支持这些,但文档和内联帮助通知它可能不会做你想要的。

$ complete -p modprobe
complete -F _modprobe modprobe
$ compgen -F _modprobe
bash: compgen: warning: -F option may not work as you expect

有记载,所以这可能是有充分理由的;这个原因恰好超出了我的范围。

无论如何,获得结果的一个非常hacky kludge是脚本readline。我不会在生产过程中放置​​类似的东西,但它在终端中工作正常,虽然我没有在更加孤立的上下文(cron,daemons)中测试它,但它实际上也可以在那里工作。

$ echo -en "bind 'set page-completions Off'
            bind 'set completion-query-items 0'
            sudo modprobe \t\t\x15" | bash -i
$ sudo modprobe 
3c574_cs                       msi-laptop
3c589_cs                       msi-wmi
3c59x                          msp3400
3w-9xxx                        mspro_block
  (...)
ms_block                       zr36067
msdos                          zr364xx
msi001                         zram
msi2500                        
$ exit

分解的:

  • bind 'set page-completions Off'避免任何“--More--”提示在不知道我们获得的页数的情况下编写脚本会感到不安。

  • set completion-query-items 0避免“显示所有3598种可能性? (是或否)“提示。

  • sudo modprobe \t\t非常明显。不要忘记标签前的空格。

  • \x15 Cu 的十六进制,默认情况下绑定到unix-line-discard,以清除该行,因此sudo modprobe实际上并未运行。

请记住,此示例中的所有输出都转到stderr。因此,如果您要将其提取以进行过滤,则需要2> file2>&1|&的某种组合。

两全其他选择,自动化@betterworld's M-* trick:

$ echo -en 'sudo modprobe \e*\x01\ed\edecho' | bash -i 2>/dev/null

这强烈假设emacs编辑模式(默认)。如果需要,请添加set -o emacs\n

答案 1 :(得分:1)

键入sudo modprobe <Esc>*,这应该将所有完成插入到命令行中。然后编辑该行,使其变为echo [list of modules] > file