回答:
brewをbash-completion
介してインストールすることにより、bashシェル補完を有効にできます。
brew install bash-completion
次に、以下を追加します~/.bash_profile
:
if [ -f $(brew --prefix)/etc/bash_completion ]; then
. $(brew --prefix)/etc/bash_completion
fi
(編集:brew tap homebrew/completions
2018で非推奨になりました。)
Macのシェルはbashであると思います。
sshコマンドを完了する必要があります。詳細については、読むことができます man complete
_complete_ssh_hosts ()
{
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
comp_ssh_hosts=`cat ~/.ssh/known_hosts | \
cut -f 1 -d ' ' | \
sed -e s/,.*//g | \
grep -v ^# | \
uniq | \
grep -v "\[" ;
cat ~/.ssh/config | \
grep "^Host " | \
awk '{print $2}'
`
COMPREPLY=( $(compgen -W "${comp_ssh_hosts}" -- $cur))
return 0
}
complete -F _complete_ssh_hosts ssh
source
ターミナルにロードする新しいコマンドを取得するには、ファイルが必要であることを忘れないでください。または、このコードを.bash_profileに配置できます
comp_ssh_hosts=$(awk -F , 'FNR== NR && ! /^#|\[/ {field = $1} FNR != NR && /^Host / {field = $2} {hosts[field]} END {for (host in hosts) {print host}' "$HOME/.ssh/known hosts" "$HOME/.ssh/config")
以下をコピーして貼り付けます~/.bash_profile
:
complete -o default -o nospace -W "$(/usr/bin/env ruby -ne 'puts $_.split(/[,\s]+/)[1..-1].reject{|host| host.match(/\*|\?/)} if $_.match(/^\s*Host\s+/);' < $HOME/.ssh/config)" scp sftp ssh
その後、ターミナルを再起動するか、入力する必要がありますsource ~/.bash_profile
(後者は現在のタブでのみ機能することに注意してください)。
参考までに、ネルソンの回答に直接応答する方法はわかりません。まだコメントするほどの評判を築いていませんが、El Capitanを実行しているマシンで^M
は、設定ファイルのすべてのホスト名に追加されていたからです。私はどちらか追加する必要がありました\r
私に$IFS
、変数または削除/のすべてのインスタンスを置き換えて\r
第二の出力からcat
。最後に、tr '\r' '\n'
コマンドチェーンを次のように追加して、後者を行いました。
cat ~/.ssh/config | \
grep "^Host " | \
awk '{print $2}' | \
tr '\r' '\n'
[ -f /usr/local/etc/bash_completion ] && . /usr/local/etc/bash_completion
ます。どのバージョン(またはそのバージョン)を優先すべきか、そしてその理由を詳しく説明してください。