GNU/Linux >> Tutoriales Linux >  >> Linux

¿Poblar Ps1 de forma asíncrona?

Tengo algunas funciones relacionadas con git svn que ven si tengo que extraer/empujar desde/hacia el repositorio.

Mi problema es que las funciones que he escrito para recopilar esta información son demasiado lentas. Me gustaría hacerlos asíncronos para que PS1 muestra un valor predeterminado, si aunque los datos producidos por las funciones están listos, quiero que se impriman.

Me gustaría tener esta información en mi aviso, para que, por ejemplo, sepa si tengo que extraer, sin hacer git svn fetch siempre.

Esta es la función a la que llamo para agregar un ↑ a mi PS1 si tengo que enviar mis cambios.

function hasToPush {
    (($1 == 0)) && 
        (git svn dcommit --dry-run 2>/dev/null | grep -q "diff-tree" && echo "↑")
}

Estas son las funciones que llamo para agregar un ↓ si tengo que tirar. El primero se usa para actualizar mi índice cada 2 minutos para que pueda hacer el (($latest > $current)) verificar.

function loopingGitSvnFetch {
     sleep 120
     git svn fetch &>/dev/null
}
loopingGitSvnFetch &
function hasToPull {
    (($1 == 0)) && (
        latest=$(git svn log | awk 'NR==2' | cut -d ' ' -f1 | tr -d 'r')
        current=$2
        (($latest > $current)) && echo "↓"
    )
}

Para hacerlos asíncronos, he intentado juntarlos así:

function async {
    {
     git diff-index --quiet --cached HEAD &>/dev/null
     dirty=$(echo $?)
     push=$(hasToPush $dirty)
     gitsvn=$(git svn info 2> /dev/null | grep Revision)
     gitsvn=${gitsvn#Revision: }
     pull=$(hastoPull $dirty $gitsvn)
     callback $push $pull
     } &
 }

Pero eso produce el mismo comportamiento lento.
He intentado poner los resultados en un archivo y luego leerlo después, pero no me gusta ese enfoque.

He pensado en usar PROMPT_COMMAND . Pero eso no sería asíncrono; sería bajo demanda.

¿Podría arrojar algo de luz sobre cómo PS1 se comporta o en lo que estoy haciendo mal?
Gracias de antemano.

PD:¿Podría alguien con 300 representantes agregar las etiquetas async y ps1?

EDITAR:

Agregué esta línea a mi .bashrc como una prueba simple, pareció funcionar, por lo que haberlas reescrito (revertí mi intento anterior) parece que fue algo bueno 🙂

while true;
do
    discoverScmInfo &>~/.ps1
    sleep 1
done &
PS1='$(customW)$(cat ~/.ps1)\$ '

Pondré esto en una función y verificaré si el trabajo ya se está ejecutando antes de llamarlo.
Lo siento, después de todo, parece que todo lo que necesitaba era escribir al respecto. 🙂

Relacionado:¿Por qué se redirige STDERR a /dev/null de esta manera?

Respuesta aceptada:

re:su solución de un bucle cada segundo:podría escribir en un archivo en /tmp, en lugar de en su directorio de inicio. Y PS1=$(customW)$(< ~/.ps1)\$ ' guardaría un fork/exec de cat .

re:la pregunta original:cómo obtener una actualización asíncrona para PS1 :
Para iniciar una escritura asíncrona en PS1 :

  • establecer PROMPT_COMMAND a una función que verifica si los datos están disponibles.
    • Si es así, actualice PS1 y desactive PROMPT_COMMAND
    • Si no, deja PS1 con el valor antiguo o marcador de posición.

Usa un archivo en /tmp para que el E/S asíncrono escriba, y PROMPT_COMMAND para leer.

Creo que esto debería funcionar.


Linux
  1. Cómo rescata Linux las computadoras lentas (y el planeta)

  2. Comience con NetworkManager en Linux

  3. Programación de tareas con el comando cron de Linux

  4. Comprender el mundo digital:mi reseña honesta del libro

  5. Administre los directorios de inicio de los usuarios de Linux con systemd-homed

Cómo escaneo fotos familiares en Linux

Cómo personalizo las decoraciones de mi ventana de Linux

Mis opciones favoritas de comando principal de Linux

¿Poblar Ps1 de forma asíncrona?

Bash Shell PS1:10 ejemplos para hacer que su Linux sea tan rápido como Angelina Jolie

Empujando mi mensaje de PS1 sobre ssh