Bash Completionファイル内で、外部スクリプトによって完了文字列を検索しています。これには時間がかかります(1〜2秒)。これらの文字列は、現在のシェルが実行されている間はほとんど同じままなので、キャッシュしたいと思います。次にBashの完了がトリガーされたときに、高価なルックアップの代わりにキャッシュされた文字列を使用して、完了するようにする必要があります。 2回目に実行するとすぐに。
完了ファイルで感じをつかむために、ここに完了ファイルの重要な部分があります:
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の出力をキャッシュするにはどうすればよいですか?ここにある種のグローバル変数、または他のトリックが必要です。
解決:
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