bash o vimscript, cómo finalizar el script pero dejando las aplicaciones que comenzó aún ejecutándose

bash o vimscript, cómo finalizar el script pero dejando las aplicaciones que comenzó aún ejecutándose

Ya sea en bash o vimscript, ¿cómo puedo ejecutar un script que inicia una aplicación (xv o display) y hacer que el script finalice devolviendo el foco a vim, pero dejando xv/display aún ejecutándose? Mi esfuerzo actual es esta función vim, que es esencialmente una versión dirigida por vim de mi intento en bash. Se bloquea en el último comando hasta que salgo de la pantalla.

" S() is called internally by :F to show images appropriately
function! S(j,k)
if system("pgrep ".a:j)!=''
exe '!pkill '.a:j
endif
exe '!'.a:j.' -geometry +0+'.a:k.@u.' &'
wmctrl -a Botany
endfunction

a:j es el nombre de la aplicación, a:k es el parámetro de posición de la pantalla, @u es la ruta del archivo

Respuesta1

Un script bash típico se vería así

#!/bin/bash

# Configuration
CMD="xv -some -parameters /and/a/path"
STDOUTLOG="/path/to/logfile"
STDERRLOG="/dev/null"

/bin/bash -c "eval '$CMD'" >"$STDOUTLOG" 2>"$STDERRLOG" &

Respuesta2

El problema era que no se puede disociar una aplicación del proceso que la inició, la solución que funciona para mí es tener algún otro proceso, ya ejecutándose, que lo haga por mí. Aquí está mi solución:

pkill -n xterm
cd /mnt/0/botany
xterm -g 80x59+885+0 -title 'Botany' -e vim -S bot.vim -o g y d "+res 8|2winc w|res 30" &
xp=
dp=
while ps ax|grep Botany|grep -v grep; do
  if [ -f q ]; then
    s=$(cat q)
    rm q
    if [[ "$s" =~ 'images.*' ]]; then
      kill $dp 2> /dev/null
      vd="$s $vd"
      xv -geometry +0+380 ${vd% *} &
      dp=$(pgrep xv|tail -1)
    else
      kill $xp 2> /dev/null
      vx="$s $vx"
      xv -geometry +0+0 ${vx% *} &
      xp=$(pgrep xv|tail -1)
    fi
    sleep 1
    wmctrl -a Botany
  fi
done
kill $dp $xp 2> /dev/null

Los primeros tres comandos, para xterm, comprenden el script original que usé para abrir este proyecto, por lo que este script continuó abierto y esperando hasta el momento en que cerré vim y dejé morir xterm, momento en el cual este script de llamada también se cerraría. . Así que aquí había un proceso útil en ejecución, sin hacer nada, y en el mismo directorio en el que estaba trabajando. Agregué el resto del código, que verifica la existencia de un archivo q, lo lee e inmediatamente lo destruye y elimina cualquier instancia en ejecución. del espectador. luego reinicia el visor usando la ruta del archivo q como imagen para mostrar. Todo completamente disociado de vim, donde mi vimscript simplemente escribe la ruta del archivo q y nunca hace referencia a la aplicación de visualización, xp.

información relacionada