bash または vimscript で、スクリプトを終了して、開始したアプリをまだ実行したままにする方法

bash または vimscript で、スクリプトを終了して、開始したアプリをまだ実行したままにする方法

bash または vimscript のいずれかで、アプリ (xv または display) を起動するスクリプトを実行し、フォーカスを vim に戻してスクリプトを終了させ、xv/display は実行したままにするにはどうすればよいでしょうか。現在取り組んでいるのはこの vim 関数で、これは基本的に bash での試みの vim 向けバージョンです。display を終了するまで、最後のコマンドでハングします。

" 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 への最初の 3 つのコマンドは、このプロジェクトを開くために使用した元のスクリプトを構成しているため、このスクリプトは開いたまま待機し、vim を閉じて xterm が終了すると、この呼び出しスクリプトも終了します。つまり、何もせずに、作業していたディレクトリに実行中の便利なプロセスがありました。残りのコードを追加しました。このコードは、ファイル q の存在を確認し、それを読み取ってすぐに破棄し、実行中のビューアのインスタンスをすべて強制終了します。次に、ファイル q のファイル パスを画像として表示するために使用して、ビューアを再起動します。これらはすべて vim から完全に切り離されており、vim スクリプトはファイル q へのファイル パスを書き込むだけで、ビューア アプリ xp を参照することはありません。

関連情報