[解決済み] bashのタブ補完はどのように機能するのですか?
質問
最近シェルにいる時間が長いのですが、タブのオートコンプリートがどのように動作するのか気になります。 その背後にあるメカニズムは何ですか? 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
.
関連
-
[解決済み] Bashスクリプトのソースディレクトリをスクリプト自体から取得するにはどうすればよいですか?
-
[解決済み] プログラムの実行やシステムコマンドの呼び出しはどのように行うのですか?
-
[解決済み] Bashシェルスクリプトでディレクトリが存在するかどうかを確認するにはどうすればよいですか?
-
[解決済み] Bashで通常のファイルが存在しないかどうかを判断する方法を教えてください。
-
[解決済み] Bashで文字列変数を連結する方法
-
[解決済み] Bashで文字列が部分文字列を含むかどうかをチェックする方法
-
[解決済み] シェルで、「2>&1」はどういう意味ですか?
-
[解決済み] Bashスクリプトからプログラムが存在するかどうかを確認するにはどうすればよいですか?
-
[解決済み] Bashで文字列をデリミターで分割するには?
-
[解決済み] Bashで変数が設定されているかどうかを確認する方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Bashでユーザの入力を変数に読み込むには?
-
[解決済み] bashのループリストで空白をエスケープするには?
-
[解決済み] シェルプログラミングで「export」は何をするのですか?重複
-
[解決済み] bashで変数に改行を埋め込もうとする [重複].
-
[解決済み] Git のコマンドライン・インターフェイスの言語を変更するにはどうしたらよいですか?
-
[解決済み] Bashで引用符で囲まれた文字列の中で環境変数を使用する方法
-
[解決済み] Bashはどのように異なるディレクトリコンテキストでコマンドを実行できますか?
-
[解決済み] シェルスクリプトからウェブブラウザを起動する方法は?
-
[解決済み] unset の使用と変数への空の設定
-
[解決済み] bash で文字列をエスケープするコマンド