2011-03-16 11 views
5

Dentro de mi archivo de finalización de bash, estoy buscando cadenas de finalización mediante un script externo, lo que lleva algún tiempo (1-2 segundos). Dado que estas cadenas permanecen mayormente igual durante el resto del tiempo que se ejecuta el shell actual, quiero almacenarlas en caché y cuando la ejecución del Bash se desencadene la próxima vez, debe usar la cadena almacenada en caché en lugar de la costosa búsqueda, para que complete inmediatamente cuando se ejecuta la segunda vez.Cómo almacenar en caché una variable utilizada dentro de un script de finalización de bash para la sesión actual

Para tener una idea acerca de la finalización de archivos, aquí es la parte importante del archivo de ejecución:

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 

¿Cómo puedo almacenar en caché la salida del getdeployablefiles para el resto de la sesión de shell? Necesito algún tipo de variable global aquí, o algún otro truco.

Solución:

sólo tenía que hacer goals no local y pregunte si está configurado. El guión final:

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 

Respuesta

7

Por qué no dejar goals de la declaración local y cambiarle el nombre a algo con una baja probabilidad de colisión de nombres, _pbt_complete_goals tal vez? Luego, podría verificar si es nulo o no, y configurarlo si es necesario.

+0

Sabía que tenía que haber algo mal con mi script. Hacer objetivos no globales y preguntar si se ha solucionado en realidad resolvió el problema. ¡Gracias! – ifischer

1

Puede escribir los valores almacenados en la memoria caché en un archivo con el PID del shell actual, y luego buscarlo y verificar que el PID coincida. Si lo hace, use el valor en caché, de lo contrario, vuelva a calcular.

+0

+1 para el enfoque interesante. Tal vez pueda usar eso para un problema posterior – ifischer

Cuestiones relacionadas