では、次のように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
。
ベストアンサー1
あなた(およびシステム)の既知のSSHホストファイルを使用してこのタスクを実行することをお勧めします。
zstyle -e ':completion:*:(ssh|scp|sftp|rsh|rsync):hosts' hosts 'reply=(${=${${(f)"$(cat {/etc/ssh_,~/.ssh/known_}hosts(|2)(N) /dev/null)"}%%[# ]*}//,/ })'
それでも/etc/hostsを代わりに使用したい場合:
strip='[:blank:]#[^[:blank:]]#'
zstyle -e ':completion:*:(ssh|scp|sftp|rsh|rsync):hosts' hosts 'reply=(${(s: :)${(ps:\t:)${${(f)~~"$(</etc/hosts)"}%%\#*}##${~strip}}})'
頑張ってください!