Piszę dopełnianie do komendy VBoxManage i zderzyłem się ze ścianą.
Otóż. Próbuję dopełnić komendę clonehd, która przyjmuje jako pierwszy parametr nazwę pliku, lub uuid. Jako że nazwa pliku jest nieco czytelniejsza niż uuid, wyciągam sobie listę plików komendą VBoxManage, pakuję he do tablicy i… tu zaczynają się schody, bo to co dostaję obecnie to:
Code: Select all
$ VBoxManage clonehd [tab]
haiku-alpha.vdi devstack1.vdi Wheeze.vdi Debian stable.vdi
linux hehe.vdi Ubuntu.vdi Debian7.vdi usb.vdi
$ VBoxManage clonehd /home
Code: Select all
$ VBoxManage clonehd [tab]
/home/gryf/.VirtualBox/HardDisks/haiku-alpha.vdi
/home/gryf/.VirtualBox/Machines/usb/usb.vdi
/home/gryf/.VirtualBox/Machines/Debian stable/Debian stable.vdi
/home/gryf/.VirtualBox/Machines/Wheeze/Wheeze.vdi
/home/gryf/.VirtualBox/Machines/Ubuntu/Ubuntu.vdi
/home/gryf/.VirtualBox/Machines/Debian7/Debian7.vdi
/home/gryf/.VirtualBox/Machines/devstack1/devstack1.vdi
/home/tmp/foo/linux hehe.vdi
$ VBoxManage clonehd /home
Code: Select all
_VBoxManage() {
local cur prev opts vms vms cmd count item
_hdcomp() {
local cur=$1
local hdds
compopt -o default
hdds=$(VBoxManage list hdds | \
grep -A 1 'normal (base)' | \
grep "Location:" | \
sed 's/Location:\s\+//' | \
tr '\n' '|' | \
sed 's/|$//')
IFS='|' read -ra hdds <<< "$hdds"
for item in "${hdds[@]}"
do
[[ ${item^^} == ${cur^^}* ]] && COMPREPLY+=("$item")
done
}
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
if [[ COMP_CWORD -ge 2 ]]; then
cmd="${COMP_WORDS[1]}"
if [[ $cmd == "-q" ]]; then
cmd="${COMP_WORDS[2]}"
fi
fi
# all possible commands for the VBoxManage
opts=$(VBoxManage -q help | \
egrep -o "^\s\s[a-z]+ " | \
grep -v VBoxManage | \
awk '{print $1}'| \
sort | \
uniq)
if [[ ${cur} == "-q" || ${COMP_CWORD} -eq 1 ]] ; then
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
return 0
fi
case "${prev}" in
...
...
...
showhdinfo|clonehd)
_hdcomp ${cur}
;;
esac
}
complete -o filenames -F _VBoxManage VBoxManage
