入力evince
してTabキーを押すと、bashシェルはを介して開くことができるすべてのファイルを一覧表示しますevince
。これはファイル名のext部分に基づいているようです。
これはシェルによって行われますか、それともアプリケーションによって実行されますかevince
?
前者の場合、シェルはアプリケーションに必要なものが何であるかをどうやって知ることができますか?
答え1
シェルで実行
ここには2つの別々の質問があります。
どこで終わったの?実装、
その他のソフトウェアコンポーネントそれが属していますか?。
完成した実装は、基本的にシェルの一部であるコマンドラインエディタと緊密に対話します。必要シェルで実行します。
完成のほとんどは、次のように実装されています。シェル機能ほとんどの殻から。
個別包装
それがアプリケーションの一部かシェルの一部かを尋ねます。
実際には、最初と2番目ではなく、別々です。
Ubuntuのほとんどの完了は次のとおりです。個別包装 bash-completion
、予想したほど完成した作業です。
Bashの一部ではありませんが、独立して管理および公開されています。
パスワード
完成した例を見てみましょうevince
。
$ apt-file list bash-completion | grep evince
bash-completion: /usr/share/bash-completion/completions/evince
$ ls -l /usr/share/bash-completion/completions/evince
-rw-r--r-- 1 root root 967 Apr 7 16:10 /usr/share/bash-completion/completions/evince
興味深い! PDFビューアの完成などの一般的なものを見つけるのではなくevince
。
このファイルにはシェル関数の実装が含まれています。そのうちのいくつかは、コマンドラインでそれを使用する方法を説明する文字列定数で構成されていますevince
。最も興味深い部分です。/usr/share/bash-completion/completions/evince
例:
_evince() {
[ ... ]
case $prev in --gdk-no-debug|--gtk-module|--gtk-debug|--gtk-no-debug|\
-p|--page-label|-i|--page-index|-l|--find|--display)
[ ... ]
_filedir '@(@(?(e)ps|?(E)PS|[pf]df|[PF]DF[...]|bmp|xpm|ico|xwd|tga|pcx)'
[ ... ]
一般オプション(例:)--gtk-debug
、アプリケーション固有のオプション(例:)について説明し、--page-label
処理できるファイル拡張子を一覧表示します。evince
.eps
.pdf
所有
組み込み関数を使用して、現在のシェルで定義されている関数を表示できますdeclare
。新しいシェルでこれを試みると、エラーメッセージが表示されます。
$ declare -f -p _evince
bash: declare: _evince: not found
パッケージがインストールさbash-completion
れていると仮定すると、これは機能がまだロードされていないことを意味します。
一つあるから大きな数字このような機能があり、その一部のみがインタラクティブシェルセッションで使用されるため、起動時にすべての機能をロードするのではなく、実際に必要な場合にのみ機能をロードするのが妥当です。
関数をロードするためにCompletionを使って試してみたいと思いますevince
。カーソルを に置き、キーを押します|
。Tab
$ evince -|<TAB>
いくつかの完了が表示されることがあります。これで関数をロードする必要があり、印刷すると上記のファイルと同じです。
$ declare -f -p _evince
すべての関数名を一覧表示するか、現在ロードされているすべての関数(完了に関連していない関数を含む)を表示するには、次のようにします。
$ declare -F | less
$ declare -f | less