私は現在、ソースから(via)Debianパッケージを自動的にインストールするmakeyourself.sh
(link to)というシェルスクリプトを書いています。/usr/bin/mys
apt-get source -b $1
そのため、最初の引数として指定されたパッケージ名にオートコンプリート機能を追加することにしました。sudo mys panth<tab><tab>
次に - で始まるすべてのパッケージを一覧表示しますpanth
。試みは次のとおりです。
complete -C "apt-cache --no-generate pkgnames" mys
しかし、うまくいかないようです。上記のTabキーを押すと、atパラメータがに変わり、mys
meを返しますsudo mys mys
。
私は何が間違っていましたか?または、complete
次のように完了する必要がある文字列を挿入する場所をコマンドに指定する必要がありますか?{}
$1
私はUbuntuベースのLinuxディストリビューションであるElementaryOSを使用しています。スクリプトは標準を使用する標準 *.sh シェルスクリプトです。#!/bin/bash
答え1
疑いがあるように、コマンドは何をすべきかについていくつかの情報を受け取ります。マニュアルに記載されていますが、complete
組み込み文書、読まなければならないプログラム可能な入門部分。
-F
およびオプションで指定されたシェル関数またはコマンドを呼び出します。-C
コマンドまたは関数が呼び出されると、上記のように、COMP_LINE
変数COMP_POINT
にCOMP_KEY
値が割り当てられます(参照:COMP_TYPE
バッシュ変数)。シェル関数が呼び出されるとCOMP_WORDS
変数も設定されます。COMP_CWORD
関数またはコマンドが呼び出されると、最初の引数は引数が完成するコマンドの名前、2番目の引数は完成する単語、3番目の引数は現在のコマンドラインで完成する単語の前の単語です。生成された完成は、完成した単語に基づいてフィルタリングされません。関数やコマンドは一致を生成するための完全な自由を持ちます。
したがって、このコマンドは3つのパラメータで呼び出されます。
- コマンド名 - 同様のコマンドの完成を1つのスクリプトにまとめることができます。
- 完成する単語 - とにかくフィルタリングされるプレフィックスに出力を制限できます。
- 前の単語 - たとえば、オプションを完成させるのに便利です。
同じパラメータが完成関数(complete -F somefunction
)に渡されます。関数を使用するかコマンドを使用するかにかかわらず、目的の一致をフィルタリングすることはあなたの仕事です。
試した結果に基づいて実行されたコマンドはですapt-cache --no-generate pkgnames mys '' mys
。これにより、mys
(apt-cache pkgnames
最初のオペランドのみを確認)で始まるパッケージ名のリストが印刷されます。最も長い共通接頭辞はmys
、bashは完了を開始しmys
、ユーザーが次の文字を選択することを期待します。
引数はコマンドに追加されるため(位置引数に渡されず、引数は-C
シェルコマンドで解析されます)、これを解析する簡単な方法はありません。最も簡単な解決策は、ラッパー機能を使用することです。
_mys () {
COMPREPLY=$(apt-cache --no-generate pkgnames "$2")
}
complete -F _mys mys