Bash oder Vimscript: Wie beende ich ein Skript, ohne die gestarteten Apps laufen zu lassen?

Bash oder Vimscript: Wie beende ich ein Skript, ohne die gestarteten Apps laufen zu lassen?

Wie kann ich in Bash oder Vimscript ein Skript ausführen, das eine App (xv oder display) startet, und das Skript beenden, indem der Fokus an vim zurückgegeben wird, xv/display aber weiterhin ausgeführt wird? Mein aktueller Versuch ist diese Vim-Funktion, die im Wesentlichen eine von Vim gesteuerte Version meines Versuchs in Bash ist. Sie bleibt beim letzten Befehl hängen, bis ich display beende.

" 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 ist der App-Name, a:k ist der Bildschirmpositionsparameter, @u ist der Dateipfad

Antwort1

Ein typisches Bash-Skript würde so aussehen

#!/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" &

Antwort2

Das Problem war, dass man eine App nicht von dem Prozess trennen kann, der sie gestartet hat. Die Lösung, die für mich funktioniert, besteht darin, dass ein anderer Prozess, der bereits läuft, das für mich erledigt. Hier ist meine Lösung:

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

Die ersten drei Befehle an xterm umfassen das ursprüngliche Skript, das ich zum Öffnen dieses Projekts verwendet habe. Dieses Skript blieb also geöffnet und wartete, bis ich vim beendete und xterm beendete. An diesem Punkt würde auch dieses aufrufende Skript beendet. Hier war also ein praktischer laufender Prozess, der nichts tat und sich in genau dem Verzeichnis befand, in dem ich arbeitete. Ich fügte den Rest des Codes hinzu, der die Existenz einer Datei q prüft, sie liest und sofort zerstört und jede laufende Instanz des Viewers beendet. Anschließend startet er den Viewer neu und verwendet den Dateipfad von Datei q als anzuzeigendes Bild. Alles vollständig von vim losgelöst, wobei mein Vimscript nur den Dateipfad in Datei q schreibt und niemals auf die Viewer-App xp verweist.

verwandte Informationen