В bash или vimscript как я могу запустить скрипт, который запускает приложение (xv или display) и заставить скрипт завершиться, вернув фокус vim, но оставив xv/display по-прежнему работающим. Мои нынешние усилия - это функция vim, которая, по сути, является версией, направленной на vim, моей попытки в bash. Он висит на последней команде, пока я не выйду из дисплея.

" 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 это имя приложения, a:k это параметр положения экрана, @u это путь к файлу

2 ответа2

1

Типичный скрипт bash будет выглядеть так

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

Проблема заключалась в том, что вы не можете отделить приложение от процесса, который его запустил. Решение, которое работает для меня, заключается в том, чтобы какой-то другой процесс, уже запущенный, сделал это для меня. Вот мое решение:

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

Первые три команды, относящиеся к xterm, содержат оригинальный сценарий, который я использовал для открытия этого проекта, поэтому этот сценарий продолжал открываться и ждал, пока я закрою vim и позволю xterm умереть, после чего этот вызывающий сценарий тоже закроется , Итак, здесь был удобный процесс, который ничего не делал, и в том самом каталоге, в котором я работал. Я добавил оставшуюся часть кода, который проверяет наличие файла q, читает его, немедленно уничтожает и уничтожает любой запущенный экземпляр средства просмотра. затем перезапускает программу просмотра, используя путь к файлу из файла q в качестве изображения для показа. Все полностью отделено от vim, где мой vimscript просто записывает путь к файлу в файл q и никогда не ссылается на приложение просмотра xp.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .