私は最近シェルで多くの時間を費やしており、タブのオートコンプリートがどのように機能するのか疑問に思っています。その背後にあるメカニズムは何ですか?bashはどのようにしてすべてのディレクトリの内容を知っていますか?
私は最近シェルで多くの時間を費やしており、タブのオートコンプリートがどのように機能するのか疑問に思っています。その背後にあるメカニズムは何ですか?bashはどのようにしてすべてのディレクトリの内容を知っていますか?
回答:
自動補完には2つの部分があります。
readjeライブラリは、fixjeですでに述べたように、コマンドライン編集を管理し、タブが押されたときにbashにコールバックして、完了を有効にします。バッシュは、すでに入力された文字によって明確に識別される(次のポイントを参照してください)補完候補のリストを与え、多くの文字などのreadlineを挿入します(セクション参照、かなり多くのreadlineのライブラリーを構成することができますコマンドライン編集バッシュのを詳細はマニュアル。)
Bash自体には、complete
個々のコマンドの完了メカニズムを定義する組み込み機能があります。現在のコマンドに何も定義されていない場合は、ファイル名による補完を使用しました(Ignacioによると、opendir / readdirを使用)。
独自の補完を定義する部分については、「プログラム可能な補完」セクションで説明しています。つまり、complete «options» «command»
いくつかのコマンドの補完を定義し
ます。例えば、complete -u su
言う
の引数完了したときにsu
コマンドを、現在のシステムのユーザーを検索します。
これが通常のオプションがカバーできるよりも複雑な場合(たとえば、引数のインデックスに応じて、または前の引数に応じて異なる補完)、を使用して-F function
、シェル関数を呼び出し、可能な補完のリストを生成できます。(これは、たとえばgitの補完に使用されます。これは非常に複雑で、指定されたサブコマンドやオプションによっては異なり、ブランチの名前を使用することもあります(bashは何も知りません)。
単にを使用して、現在のbash環境で定義されている既存の補完を一覧表示complete
して、何が可能かを印象付けることができます。bash-completionパッケージがインストールされている(またはシステム上で名前が付けられている)場合、多くのコマンドの補完がインストールされ、Wrikkenが言ったように、/etc/bash_completion
シェルの起動時にこれを構成するためにしばしば実行されるbashスクリプトが含まれています。追加のカスタム補完スクリプトをに配置できます/etc/bash_completion.d
。これらはすべてから供給されてい/etc/bash_completion
ます。
/etc/bash_completion
(少なくとも、そこには多くの魔法がDebianにあります)。