カスタムスクリプトにオートコンプリート機能を追加する

カスタムスクリプトにオートコンプリート機能を追加する

私は現在、ソースから(via)Debianパッケージを自動的にインストールするmakeyourself.sh(link to)というシェルスクリプトを書いています。/usr/bin/mysapt-get source -b $1

そのため、最初の引数として指定されたパッケージ名にオートコンプリート機能を追加することにしました。sudo mys panth<tab><tab>次に - で始まるすべてのパッケージを一覧表示しますpanth。試みは次のとおりです。

complete -C "apt-cache --no-generate pkgnames" mys

しかし、うまくいかないようです。上記のTabキーを押すと、atパラメータがに変わり、mysmeを返しますsudo mys mys

私は何が間違っていましたか?または、complete次のように完了する必要がある文字列を挿入する場所をコマンドに指定する必要がありますか?{}$1

私はUbuntuベースのLinuxディストリビューションであるElementaryOSを使用しています。スクリプトは標準を使用する標準 *.sh シェルスクリプトです。#!/bin/bash

答え1

疑いがあるように、コマンドは何をすべきかについていくつかの情報を受け取ります。マニュアルに記載されていますが、complete組み込み文書、読まなければならないプログラム可能な入門部分

-Fおよびオプションで指定されたシェル関数またはコマンドを呼び出します。-Cコマンドまたは関数が呼び出されると、上記のように、COMP_LINE変数COMP_POINTCOMP_KEY値が割り当てられます(参照:COMP_TYPEバッシュ変数)。シェル関数が呼び出されるとCOMP_WORDS変数も設定されます。COMP_CWORD関数またはコマンドが呼び出されると、最初の引数は引数が完成するコマンドの名前、2番目の引数は完成する単語、3番目の引数は現在のコマンドラインで完成する単語の前の単語です。生成された完成は、完成した単語に基づいてフィルタリングされません。関数やコマンドは一致を生成するための完全な自由を持ちます。

したがって、このコマンドは3つのパラメータで呼び出されます。

  • コマンド名 - 同様のコマンドの完成を1つのスクリプトにまとめることができます。
  • 完成する単語 - とにかくフィルタリングされるプレフィックスに出力を制限できます。
  • 前の単語 - たとえば、オプションを完成させるのに便利です。

同じパラメータが完成関数(complete -F somefunction)に渡されます。関数を使用するかコマンドを使用するかにかかわらず、目的の一致をフィルタリングすることはあなたの仕事です。

試した結果に基づいて実行されたコマンドはですapt-cache --no-generate pkgnames mys '' mys。これにより、mysapt-cache pkgnames最初のオペランドのみを確​​認)で始まるパッケージ名のリストが印刷されます。最も長い共通接頭辞はmys、bashは完了を開始しmys、ユーザーが次の文字を選択することを期待します。

引数はコマンドに追加されるため(位置引数に渡されず、引数は-Cシェルコマンドで解析されます)、これを解析する簡単な方法はありません。最も簡単な解決策は、ラッパー機能を使用することです。

_mys () {
  COMPREPLY=$(apt-cache --no-generate pkgnames "$2")
}
complete -F _mys mys

関連情報