Как кэшировать переменную, используемую внутри сценария завершения Bash для текущего сеанса

Внутри моего файла завершения 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
6
задан Ingo Fischer 16 March 2011 в 17:03
поделиться