「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_real
ssh
compgen -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/