我想知道一种方法来获取命令的可能完成列表但不执行它。例如,要获取可加载的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
答案 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> file
,2>&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