特定のコマンドの後に Bash の自動補完が機能しない

特定のコマンドの後に Bash の自動補完が機能しない

私は bash / Cygwin で graphViz を使用していますが、どういうわけか、それを呼び出すと、bash タブのオートコンプリートが何も実行されません。

サンプルファイル:

  • myGraph.graphviz入力ファイル
  • myGraph.graphviz.png出力ファイルになります。

グラフィックを作成するコマンドは

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

もちろん入力したい

ドット -T png -o my Tab.png myTab

これらのファイル名を自動補完しようとしましたが、何も起こりません。と入力して が表示されるのですが、 の後はなぜ機能しないのでしょうか? bash では、入力できるコマンドごとに追加の自動補完モジュールが必要なのでしょうか?cat myTabcat myGraph.graphvizdot

答え1

Debian でサンプル ファイルを作成しました。確かに動作しません。その後 (手動で完了した後)も動作しません。2 つの問題があります。dot -T png -o myTabdot -T png -o myGraph.graphviz.png myTab


一般マニュアルGraphviz プログラムの場合は以下を指定します:

-ooutfile
出力をファイルに書き込む出力ファイル。 […]

私の Debian での Bash 補完は文字通りこれに従います。 はサポートしますが、 はサポートしません。 後者が で動作するとしても(これは知りませんが)、補完は をサポートしません。次のように進めてください。-ooutfile-o outfiledot

ドット -T png -omyTab

の後にスペースを入れないでください-o。私のテストでは上記は機能します。


2 番目のTab作品を作るために、私は検査しました/usr/share/bash-completion/completions/dot。最後のほうの関連する行は次のとおりです。

_filedir dot

これにより、下に行くディレクトリと指定するファイルが提供されますが、ファイル名が.dotまたはで終わるファイルのみとなります.DOT。おそらく、手動でこのパターンに一致しないファイルを指定しても何も問題は起こりませんが、補完メカニズムに頼る場合はファイル名が適切に終了するはずです。

実のところ、私は全く知りませんdot。Bashの補完については少し知っています。おそらく、この要件は意味をなさないので、補完はdotもっと役に立つでしょう。どれでもファイルです。このような場合、元のファイルをコピーして/etc/bash_completion.d/コピーを修正します。

_filedir dot

関数の最後は

_filedir

これはシステム全体の変更です。この変更は既存のシェルには影響しませんので、新しいシェルを作成してbashテストしてください。変更できない場合(または変更したくない場合)/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自動補完スクリプトがドキュメントと一致していないか、引数に間違いがあったことが考えられます。

関連情報