![执行某些命令后 Bash 自动完成功能不起作用](https://linux22.com/image/1604359/%E6%89%A7%E8%A1%8C%E6%9F%90%E4%BA%9B%E5%91%BD%E4%BB%A4%E5%90%8E%20Bash%20%E8%87%AA%E5%8A%A8%E5%AE%8C%E6%88%90%E5%8A%9F%E8%83%BD%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8.png)
我在 bash/Cygwin 下使用 graphViz,但是不知何故,在调用它时,bash tab 自动完成功能没有任何作用。
示例文件:
myGraph.graphviz
是输入文件myGraph.graphviz.png
应该是输出文件。
制作图形的命令是
dot -T png -o myGraph.graphviz.png myGraph.graphviz
我当然想输入
点-T png -o 我的Tab.png 我的Tab
自动完成这些文件名,但什么也没发生!我可以输入并给出,但为什么输入后不起作用? bash 是否需要为我可以输入的每个命令添加额外的自动完成模块?cat myTab
cat myGraph.graphviz
dot
答案1
我在我的 Debian 中创建了示例文件。确实,不起作用。然后(手动完成后)也不起作用。有两个单独的问题。dot -T png -o myTab
dot -T png -o myGraph.graphviz.png myTab
一般手册对于 Graphviz 程序指定:
-ooutfile
将输出写入文件输出文件。 […]
我的 Debian 中的 Bash 补全遵循字面意思:它支持,不支持。即使后者可以与 一起使用(我不知道这一点),补全也不支持它。您应该按如下方式进行:-ooutfile
-o outfile
dot
点-T png-omyTab
后面没有任何空格-o
。在我的测试中,上述操作有效。
为了制作第二件Tab作品,我检查了/usr/share/bash-completion/completions/dot
。结尾附近的相关行是:
_filedir dot
这将为您提供要进入的目录和要指定的文件,但仅限于名称以.dot
或结尾的文件.DOT
。也许你可以手动提供一个与此模式不匹配的文件,不会发生任何不好的事情,但是如果您依赖完成机制,则文件名应该正确结束。
事实上我完全不知道dot
,我对 Bash 补全略知一二。也许这个要求没有意义,dot
如果允许的话,补全会更有帮助任何文件。在这种情况下,我将原始文件复制到/etc/bash_completion.d/
并修改副本,因此行
_filedir dot
函数末尾变成
_filedir
这是系统范围的更改。此更改不会影响现有 shell,因此请启动一个新 shellbash
进行测试。如果您无法(或不想)修改,/etc/bash_completion.d/
请参阅这个答案。它提供了一种方法来拥有您的私人(用户特定的)bash_completion.d/
。
请注意,此更改将允许您键入,并且补全将起作用。但是,在此特定情况下,它与内部无关,它是操作数的一般补全,即使在某些意外或无效选项(例如)之后它也会起作用。dot -T png -o myTab
-o
dot -T png -: myTab
答案2
如果系统上有另一个dot
命令安装了真正的自动完成定义,并且该命令此时不需要文件,则可能会发生这种情况。默认情况下,对于未知命令,所有参数都会获得文件自动完成,但特定命令可以设置自己的特定自动完成。检查/etc/bash_completion
和/etc/bash_completion.d/
。
PS:另一种解释是dot
自动完成脚本与文档不一致,或者您的论点有错误。