zsh
では、/etc/hosts
からホスト名をオートコンプリートできます。つまり、
ssh f<TAB>
f
で始まるホストの補完を提供します。
これは/usr/share/zsh/functions/Completion/Unix/_hosts
で設定されます:
local ipstrip='[:blank:]#[^[:blank:]]#'
zstyle -t ":completion:${curcontext}:hosts" use-ip && useip=yes
[[ -n $useip ]] && ipstrip=
if (( ${+commands[getent]} )); then
_cache_hosts=(${(s: :)${(ps:\t:)${(f)~~"$(_call_program hosts getent hosts 2>/dev/null)"}##${~ipstrip}}})
else
_cache_hosts=(${(s: :)${(ps:\t:)${${(f)~~"$(</etc/hosts)"}%%\#*}##${~ipstrip}}})
fi
....
_hosts=( "$_cache_hosts[@]" )
ただし、/etc/hosts
ファイルの形式が「IP」「ホスト名」の場合にのみ機能します。つまり、
192.168.1.4 foo.mydomain.com
iPがない場合は機能しません。
foo.mydomain.com
IPなしのホスト名も補完されるように、補完スクリプトを変更するにはどうすればよいですか?
/etc/hosts
からのIPなしのホスト名の補完は、bash_completion
で正常に機能します。したがって、私はzsh
で同じ動作を取得しようとしています。
/usr/share/zsh/functions/Completion/Unix/_hosts
にフィルター関数を追加します。
provide_missing_ip() {
while read x ; do
set -- $x
if [ ! "$1" ] || [ "${1%%[^#]*}" ] || [ "$2" ] ; then
echo "$x"
else
ip=`Dig +short $2`
[ "$ip" ] || ip="240.0.0.0"
printf "%s\t%s\n" $1 $2
fi
done
}
使い方:
Dig
を付けて指定してください。新しい関数を使用して、面倒な完了コードのgetent
または< /etc/hosts
の出力を解析します。
if (( ${+commands[getent]} )); then
_cache_hosts=(${(s: :)${(ps:\t:)${(f)~~"$(_call_program hosts getent hosts 2>/dev/null | provide_missing_ip )"}##${~ipstrip}}})
else
_cache_hosts=(${(s: :)${(ps:\t:)${${(f)~~"$(provide_missing_ip </etc/hosts)"}%%\#*}##${~ipstrip}}})
fi