在我的 Bash 完成文件中,我正在通过外部脚本查找完成字符串,这需要一些时间(1-2 秒)。由于这些字符串在当前 shell 运行的其余时间大部分保持不变,我想缓存它们,并且当下次触发 Bash 完成时,它应该使用缓存的字符串而不是昂贵的查找,以便它完成当它第二次运行时立即。
要通过完成文件来感受一下,这里是完成文件的重要部分:
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
如何为 shell 会话的其余部分缓存 getdeployablefiles 的输出?我在这里需要某种全局变量,或者其他一些技巧。
解决方案:
只需要制作goals
非本地并询问它是否已设置。最终脚本:
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