Bash 自動補全在某些指令後不起作用

Bash 自動補全在某些指令後不起作用

我在 bash / Cygwin 下使用 graphViz,但不知何故,在呼叫它時,bash 選項卡自動完成不會執行任何操作。

範例檔:

  • myGraph.graphviz是輸入檔
  • myGraph.graphviz.png應該是輸出檔。

製作圖形的命令是

dot -T png -o myGraph.graphviz.png myGraph.graphviz

我當然想輸入

點-T png-o 我的Tab.png 我的Tab

自動完成這些檔名,但沒有任何反應!我可以輸入並且它給出了,但為什麼之後不起作用? bash 是否需要為我可以輸入的每個命令提供額外的自動完成模組?cat myTabcat myGraph.graphvizdot

答案1

我在 Debian 中建立了範例文件。確實,行不通。然後(手動完成後)也不起作用。有兩個單獨的問題。dot -T png -o myTabdot -T png -o myGraph.graphviz.png myTab


通用手冊對於 Graphviz 程式指定:

-ooutfile
將輸出寫入文件輸出檔案。 […]

我的 Debian 中的 Bash 補全實際上遵循這一點:它支持,而不是。即使後者可以使用(我不知道這一點),完成也不支援它。你應該像這樣繼續:-ooutfile-o outfiledot

點-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-odot -T png -: myTab

答案2

如果系統上有另一個dot命令安裝了真正的自動完成定義,並且該命令此時不需要文件,則可能會發生這種情況。預設情況下,對於未知命令,您可以在所有參數上獲得檔案自動完成功能,但特定命令可以設定自己的特定自動完成功能。檢查/etc/bash_completion/etc/bash_completion.d/

PS:另一種解釋是dot自動完成腳本與文件不一致,或者您在論點中犯了錯誤。

相關內容