Представьте, что у меня есть скрипт bash myscript
, который будет echo
только первым аргументом, который будет именем каталога.
Пример использования:
myscript proj1
Где proj1
- это каталог, например, расположенный в ~/folder1/folder2/proj1
, а ваш текущий рабочий каталог - ~/
.
Мой вопрос заключается в том, чтобы для этого сценария я мог написать правило завершения, чтобы myscript [tab][tab]
перечислял все каталоги, доступные для echo
, начиная с ~/
. Это означает, что в первом примере и предполагая, что это единственные каталоги в ~/
, myscript pro[tab]
завершит выражение до myscript proj1
.
Может ли кто-нибудь помочь мне достичь этого?
Заранее спасибо.
Ваше описание кажется нечетным: Если Вы становитесь справедливыми proj1
, как Вы знаете, каков его родительский каталог?
Так или иначе, чтобы дать Вам, что Вы попросили:
# for me, this takes a looooooong time [1]. Do it once and cache it
mapfile -t _all_dir_names < <( find ~ -type d -printf "%f\n" )
# the function you want completion for
myfunc () { echo hello world $*; }
# the completion function
complete_myfunc() {
local dir cur=${COMP_WORDS[COMP_CWORD]}
COMPREPLY=()
for dir in "${_all_dir_names[@]}"; do
if [[ $dir == "$cur"* ]]; then
printf -v dir "%q" "$dir" # protect whitespace in the dir name
COMPREPLY+=("$dir")
fi
done
}
# registering the completion
complete -F complete_myfunc myfunc
[1]: 2 минуты, 66 782 каталога