1. ホーム
  2. bash

[解決済み] bashのタブ補完はどのように機能するのですか?

2022-07-30 06:23:18

質問

最近シェルにいる時間が長いのですが、タブのオートコンプリートがどのように動作するのか気になります。 その背後にあるメカニズムは何ですか? bash はどのようにすべてのディレクトリの内容を知っているのですか?

どのように解決するのですか?

オートコンプリートには2つの部分があります。

  • readline ライブラリは、fixje が既に述べたように、コマンドライン編集を管理し、タブが押されたときに bash にコールバックし、補完を可能にします。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 .