Внутри моего файла завершения Bash я ищу строки завершения с помощью внешнего сценария, что занимает некоторое время (1-2 секунды). Поскольку эти строки в основном остаются неизменными в течение всего остального времени работы текущей оболочки, я хочу кэшировать их, и когда завершение Bash запускается в следующий раз, оно должно использовать кешированную строку вместо дорогостоящего поиска, чтобы он завершился немедленно при запуске во второй раз.
Чтобы получить представление о завершении file, вот важная часть файла завершения:
getdeployablefiles()
{
# How can i cache the result of 'pbt getdeployablefiles'
# for the time the current shell runs?
echo `pbt getdeployablefiles`
}
have pbt &&
_pbt_complete()
{
local cur goals
COMPREPLY=()
cur=${COMP_WORDS[COMP_CWORD]}
goals=$(getdeployablefiles)
COMPREPLY=( $(compgen -W "${goals}" -- $cur) )
return 0
} &&
complete -F _pbt_complete pbt
Как я могу кэшировать вывод getdeployablefiles для остальной части сеанса оболочки? Мне здесь нужна какая-то глобальная переменная или другой трюк.
Решение:
Просто нужно было сделать цели
нелокальными и спросить, установлены ли они. Окончательный сценарий:
getdeployablefiles()
{
echo `pbt getdeployablefiles`
}
have pbt &&
_pbt_complete()
{
local cur
if [ -z "$_pbt_complete_goals" ]; then
_pbt_complete_goals=$(getdeployablefiles)
fi
_pbt_complete_goals=$(getdeployablefiles)
COMPREPLY=()
cur=${COMP_WORDS[COMP_CWORD]}
COMPREPLY=( $(compgen -W "${_pbt_complete_goals}" -- $cur) )
return 0
} &&
complete -F _pbt_complete pbt