2011-03-16 17 views
5

Bash Tamamlama dosyamda, tamamlama dizelerini bir dış komut dosyasıyla buluyorum, bu da biraz zaman alıyor (1-2 saniye). Bu dizgiler çoğunlukla geçerli kabuk çalıştığı zamanın geri kalanı için aynı kaldığı için, bunları önbelleğe almak istiyorum ve bir sonraki sefer Bash tamamlaması tetiklendiğinde, pahalı arama yerine önbelleğe alınmış dizeyi kullanması gerekir, böylece tamamlanır ikinci kez koştuğunda hemen.Geçerli oturum için Bash Tamamlama Komut Dosyası içinde kullanılan bir değişkeni önbellekleme nasıl yapılır

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 

Nasıl kabuk oturumunun kalanında getdeployablefiles çıktısını önbelleğe alabilir:

tamamlama dosyası tarafından hakkında bir fikir edinmek için buraya tamamlama dosyasının önemli bir parçasıdır? Burada bir çeşit küresel değişkene ya da başka bir numaraya ihtiyacım var.

Çözüm:

Sadece goals yerel olmayan yapmak ve ayarlandıktan sormak zorunda kaldı. Nihai komut dosyası:

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 

cevap

7

Neden _pbt_complete_goals belki local açıklamada dışına goals terk edip isim çarpışma olasılığı düşük olan bir şeye yeniden adlandırmak? Sonra, null veya unset olup olmadığını kontrol edip gerekirse ayarlayabilirsiniz.

+0

Komut dosyasının kendisinde bir sorun olması gerektiğini biliyordum. Küresel olmayan hedefler koymak ve ayarlanmış olup olmadığını sormak sorunu gerçekten çözdü. Teşekkürler! İlginç bir yaklaşım için – ifischer

1

Önbelleğe alınan değerleri geçerli kabuğun PID'sine sahip bir dosyaya yazabilir, sonra da kaynak gönderebilir ve PID'nin eşleştiğini kontrol edebilirsiniz. Eğer varsa, önbelleğe alınmış değeri kullanın, aksi halde yeniden hesaplayın.

+0

+ 1. Belki bunu daha sonraki bir problem için kullanabilirim – ifischer

İlgili konular