bashタブ補完はどのように機能しますか?


113

私は最近シェルで多くの時間を費やしており、タブのオートコンプリートがどのように機能するのか疑問に思っています。その背後にあるメカニズムは何ですか?bashはどのようにしてすべてのディレクトリの内容を知っていますか?


2
あなたはチェックしたいかもしれません/etc/bash_completion(少なくとも、そこには多くの魔法がDebianにあります)。
Wrikken

1
@Wrikken:これはbash_completionです。これはタブ補完に依存しますが、それがどのように発生するかは完全ではありません。
Ignacio Vazquez-Abrams

回答:


100

自動補完には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ます。


1
manページは独立したコマンドのためだけにあり、シェルのビルトインのためのものではありません。しかし、それは私がリンクしたbashマニュアルの一部です。
パウロEbermann

7

基本に興味がある場合:Bashは、履歴と基本的な補完機能を備えたreadlineを使用します。詳細を知りたい場合は、ソースを調べることができます。さらに、readlineを使用して、完成した独自のCLIインターフェイスを構築できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.