Bash / Zshは完了中に関連コマンドをどのように識別しますか?

Bash / Zshは完了中に関連コマンドをどのように識別しますか?

対話型ログインシェル(zshまたはbash)への入力を開始し、[次へ]をクリックすると商標、シェルはオートコンプリートの提案を提供します。

完成仕様がどのように定義されるかを大まかに知っています。ちなみに、概要は次のとおりです。

私が理解していないのは、ユーザーがタブを押したときにbash / zshがどのコマンドを完了するべきかを認識する方法です。つまり、これを行うとls [tab]bash / zshはどのように認識しますかls?つまり、bash / zshはls完成仕様を使用して完成を生成する方法をどのように理解できますか?

より複雑な解析を含むいくつかの例があります。 Bash / Zshはまだ正確です。

  • ls [tab] ->完了ls
  • echo $( echo $(ls [tab] ->完了ls
  • echo hi; git a[tab] ->完了git
  • echo 'cd [tab] - >完了しないcd
  • echo "$(ls [tab] ->完了ls
  • echo $( echo hi | ls [tab] - >完了ls
    (stdinが許可されていないことを知っていますが、lsこの例ではまだbash / zshの解析機能を示しています)

私はbash / zshがある種のパーサーを使用していると仮定します。しかし、これは一般的なパーサーではありません。適切に設定されたコマンドがなくても実行できます。閉じていない場合でも、引用符やシェル拡張で囲まれた内容があることがわかります。

bash / zshは、関連するコマンドを「識別」または完了する必要があるコマンドがあるかどうかを確認するためにどのような機能を実行しますか?

ベストアンサー1

bash / zshは、関連するコマンドを「識別」または完了する必要があるコマンドがあるかどうかを確認するためにどのような機能を実行しますか?

readline は を押すとtabこのcomplete関数を実行します。

以下でこれを上書きできます~/.inputrc

"\t": complete

completeとして定義lib/readline/funmap.c:

static const FUNMAP default_funmap[] = {
[..]
{ "complete", rl_complete },

rl_complete許可lib/readline/complete.c(ソースコードの参照):

/* Complete the word at or before point.  You have supplied the function
   that does the initial simple matching selection algorithm (see
   rl_completion_matches ()).  The default is to do filename completion. */
int
rl_complete (int ignore, int invoking_key)
{
..

これが出発点です。単語を分解して、どの完成が登録されているかを確認し、関連する完成を見つけます。

zshにも同様の実装があるかもしれません。

プロセスもよく説明されています。ここ

おすすめ記事