Bashの自動補完はどのように機能しますか?


9

bashのオートコンプリートが標準のユーティリティで機能することを理解できます。しかし、Oracle SQLローダーなどのカスタムプログラムのオートコンプリートはどのように行われるのでしょうか。

次のコマンドでTabを押すcontrol=と、制御ファイル名に自動補完されます。

sqlldr kshitiz/oracle@XE control=data.ctl data=data.csv bad=data.bad log=data.log

他のファイルではなく、その時点で制御ファイルに入力する必要があることをどのようにして知るのでしょうか。


2
パラメータの完成は関数で行われます。それらのほとんどはで設定され/etc/bash_completion.dます。また/etc/bash_completion、の出力を見て、set環境がどの程度成長したかを確認してください。
ott-- 2015年

@ottその場所で何を探すべきですか?sqlldrに関連するものは何も表示されません。私が持っているすべては、次のとおりですgdbus-bash-completion.sh gvfs-bash-completion.sh pk-completion.bash yum.bash。の出力setはまったく面白くありません。
Kshitiz Sharma

からのスクリプトでも実行でき/etc/profile.dます。または多分あなたの.bash_profileまたは.bashrc変更されました。
ott-- 2015年

これらの機能は通常の機能とどう違うのですか。また、カスタムスクリプトにオートコンプリートを提供するために、独自のスクリプトを定義するにはどうすればよいですか。正しい方向に向けてもらえますか?
Kshitiz Sharma

1
@KshitizSharma、bash-completion以来、動的に補完をロードします1.90。試してください:sqlldr<space><tab><enter>。次にと入力しcomplete -p sqlldrます。
Evgeny Vereshchagin 2015年

回答:


6

Bashのプログラム可能な補完は、コマンドラインを解析して、何が補完されているかを把握することで機能します。

  1. 一部のコンテキストは特別に扱われます。たとえば、コマンドの最初の単語はコマンド名として補完され、その後に続くもの$は変数名として補完されます。
  2. これらのコンテキスト外では、bashはコマンドの引数を完成させようと試み、コマンドのベース名にコマンドの設定または失敗(通常はそうです)の設定が適用されます。

たとえば、bashは、で始まるコマンド名を補完します。その後、bashはで始まる変数名を完成させます。その後、bashはコマンドの完了規則を適用します。完了ルールでは、カテゴリ(ユーザー、変数、ファイルなど)、ファイル名のワイルドカードパターン、または実行する関数やコードスニペットを指定できます。sqllTabsqllsqlldr $aTabasqlldr Tabsqlldr

完了ルールはcomplete組み込みによって定義されます。Bashは、completeビルトインがいつ呼び出されたか、またはどのスクリプト(存在する場合)が含まれていたかを追跡しません。ほとんどのディストリビューションは、一般的なコマンドの一連のルールを提供するbash-completionパッケージを出荷しています。これは、への呼び出しを含む一連のスクリプトファイルの形式をとり、これらのスクリプトをすべてcomplete読み込むには.bashrc(または/etc/bash.bashrc実装されている場合)読み込む必要があるスクリプトが含まれます。通常、. /etc/bash_completionプログラム可能な補完をアクティブにして利用可能なスクリプトを読み込むために必要です。

標準パッケージには、のサポートは含まれていませんsqlldr。そのようなサポートがある場合は、別のソースからのものである必要があります。このソースは、のようなディレクトリにファイルをドロップした/etc/bash_completion.dか、にコードを含めるための指示が付属している可能性があります.bashrc。を使用complete -p sqlldrして、の現在のルールを確認できますsqlldr。前に述べたように、これはそれらのルールがどこからロードされたかを教えてくれません。

Tcsh、zsh、fishのメカニズムはいくぶん似ています(誰もがtcshからインスピレーションを得ています)が、組み込み、構文、機能が異なります。


はい、complete呼び出された場所を見つけることができません。しかし、補完関数が定義されているソースファイル名と行番号を見つけることができます。complete -p sudo # outputs complete -F _sudo sudoshopt -s extdebugdeclare -F _sudo # outputs _sudo 3 /usr/share/bash-completion/completions/sudo。(しかし、動的補完の読み込みとについての私のコメントを参照してくださいcomplete -p)。
Evgeny Vereshchagin 2015年

and the settings for the basename of the command are applied。いいえ。dateおよびには異なるcompspecsを設定できます/bin/date。リファレンスは言う:コマンドワードが完全パス名である場合、完全パス名のcompspecが最初に検索されます。完全パス名のcompspecが見つからない場合、最後のスラッシュに続く部分のcompspecを見つけようとします
Evgeny Vereshchagin
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.