bash完了関数_known_hosts_realに ":"を含むプロトコルプレフィックスを指定する方法

bash完了関数_known_hosts_realに ":"を含むプロトコルプレフィックスを指定する方法

「proto://host」形式の URL に bash-completion を使用しようとしています。 「:」がなければ、予想される動作を見ることができますが、「:」がある場合、URLに「エラー」が発生します。

Bashを完成させるためのホスト名関数がありますが、ここに私が使用したいパラメータが_known_hosts_realあります。-p PREFIX

「無効な」動作を再現する方法:

システムに「既知の」ホストが少なくとも1つ必要です。

例えばecho "gdns.google 8.8.8.8" >> /etc/hosts

機能の例を表示するには、次のコマンドを実行します。

$ unset COMPREPLY 
$ _known_hosts_real -p 'http//' -- "gdn"
$ echo $COMPREPLY 
http//gdns.google

動作しない例:

$ unset COMPREPLY 
$ _known_hosts_real -p 'http://' -- "gdn"
$ echo $COMPREPLY 
//gdns.google

唯一の違いは、「http://」にコロンが追加されることです。ここでの問題は、プレフィックスにプロトコル指定子とコロンがないことです。これが予想される動作ですか?

答え1

これは、コロンで終わるプレフィックスを削除する予想さ_known_hosts_realれる動作です。既知のホストファイルで使用するように設計されているので、おそらく 。__ltrim_colon_completions_known_hosts_realsshcompgen -A hostname

答え2

@Michael_Veersはこれが予想される動作(+1)であると指摘したので、私の関数を直接書く必要があります。

_known_hosts_realしかし、代わりに追加オプションを有効にするために、bashrcにその標準のパッチを作成しました。

  • -t左コロンまでトリミングしないでください。
  • -S <suffix>カスタムサフィックスを追加

存在する.bashrc

 . <(type _known_hosts_real | sed -e '
 1d;s/acF:p:/actS:F:p:/;
 s/^.*c)/\nS)\nsuffix=$OPTARG\n;;\nt)\nnotrim=1\n;;\nc)/;
 s/\(__lt\)/[ $notrim ]||\1/')

これで期待どおりに動作します。

$ unset COMPREPLY
$ _known_hosts_real -p "scp://" -S '/' -t -a gdn
$ echo $COMPREPLY
scp://gdns.google/

関連情報