bash 또는 vimscript, 스크립트를 종료했지만 앱을 종료한 후 계속 실행되는 방법

bash 또는 vimscript, 스크립트를 종료했지만 앱을 종료한 후 계속 실행되는 방법

bash 또는 vimscript에서 앱(xv 또는 디스플레이)을 시작하는 스크립트를 실행하고 vim에 포커스를 되돌리고 xv/display를 계속 실행하여 스크립트를 종료하도록 하려면 어떻게 해야 합니까? 나의 현재 노력은 vim 함수인데, 이는 본질적으로 bash에서의 시도에 대한 vim 지향 버전입니다. 디스플레이를 종료할 때까지 마지막 명령에서 정지됩니다.

" 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는 파일 경로입니다.

답변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" &

답변2

문제는 앱을 실행한 프로세스에서 앱을 분리할 수 없다는 것입니다. 나에게 적합한 솔루션은 이미 실행 중인 다른 프로세스를 사용하여 해당 작업을 수행하도록 하는 것입니다. 내 해결책은 다음과 같습니다.

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의 파일 경로를 표시할 이미지로 사용하여 뷰어를 다시 시작합니다. 내 vimscript는 파일 q에 파일 경로를 작성하고 뷰어 앱인 xp를 참조하지 않는 vim과 완전히 분리되었습니다.

관련 정보