`次のように完成したら:
$ cat _anssh
#compdef anssh
_anssh () {
_arguments '-i[inventory file]:filename:->files'
case "$state" in
files)
_anssh_inventories_show
;;
*)
_anssh_hosts_show
;;
esac
}
_anssh_inventories_show () {
local -a inventories
inventories=("${(@f)$(find hosts -maxdepth 1 -type f -printf 'hosts/%f\n')}")
_multi_parts / inventories
}
_anssh_hosts_show () {
local inv=$(echo $@ | sed 's/.*\-i\s*//g' | awk '{print $1}')
local invflag=""
if [ "$inv" != "" ]; then
invflag="--inventory $inv"
fi
local hosts=("${(s/ /)$(anssh $invflag -l)}")
_values 'hosts' $hosts
}
機能しない部分は、定義方法(定義されている場合)_anssh_host_show
によって-i
異なる値を返す必要があることです。-i
fromの値を抽出してみましたが$@
(これはこれまでに入力した完全なコマンドであると予想しました)、$@
完了コンテキストでは空です。その文字列をどのように取得しますか?
答え1
これにより、トリックを実行できます。
#compdef anssh
local -a command
_anssh () {
command="$words"
_arguments '-i[inventory file]:filename:->files'
case "$state" in
files)
_anssh_inventories_show
;;
*)
_anssh_hosts_show
;;
esac
}
_anssh_inventories_show () {
local -a inventories
inventories=("${(@f)$(find hosts -maxdepth 1 -type f -printf 'hosts/%f\n')}")
_multi_parts / inventories
}
_anssh_hosts_show () {
local inv=$(echo $command | grep ' -i' | sed 's/.*\-i\s*//g' | awk '{print $1}')
local invflag=""
if [ "$inv" != "" ]; then
invflag="-i $inv"
fi
local hosts=("${(s/ /)$(anssh $invflag -l)}")
_values 'hosts' $hosts
}
_anssh