ワイルドカードホストをインポートせずにSSH構成からホストをインポートする関数を作成しました。
sshConfAutoComplete() {
cat ~/.ssh/config | \
grep 'host ' | \
sed '
s#.*\*##g;
s#host ##g
'
}
出力:
pi
lynx
iridium
batchelorantor
rasp
出力が正しいため、この機能を次に追加しました。
/usr/local/etc/bash_completion.d/ssh
このように:
sshConfAutoComplete() {
cat ~/.ssh/config | \
grep 'host ' | \
sed '
s#.*\*##g;
s#host ##g
'
}
complete -F sshConfAutoComplete ssh
その後、次のソースを追加しました. /usr/local/etc/bash_completion.d/ssh
。~/.bash_profile
~/bash_profile
次のように入力するとSourcedssh <tab>
が表示されます。
pi
lynx
iridium
batchelorantor
rasp
入力するとオートコンプリートされssh ly <tab>
ず、lynx
上記の内容のみが出力されます。
どうすれば解決できますか?
ベストアンサー1
man bash
タイトルにプログラム可能な完成呼び出された関数が-F
配列変数に一致する結果を提供する方法を説明しましたCOMPREPLY
。通常、コマンドによって提供される完全なリストはsed
コマンドに渡され、その単語をターゲット単語(たとえば関数の引数2())と一致させようcompgen -W
とします。$2
少し単純化すると、次のような結果が得られます。
sshConfAutoComplete() {
COMPREPLY=( $(compgen -W \
"$(sed -n ' /host /{s#.*\*##g; s#host ##g; p} ' ~/.ssh/config)" -- "$2"))
}
complete -F sshConfAutoComplete ssh
MacOSでは標準sed
コマンドは許可されていないため、;
各コマンドは改行でなければなりません。
COMPREPLY=( $(compgen -W \
"$(sed -n '/^host /{
s#.*\*##g
s#host ##g
p
}' ~/.ssh/config)" -- "$2"))