bash 或 vimscript,如何終止腳本但使其啟動的應用程式仍在執行

bash 或 vimscript,如何終止腳本但使其啟動的應用程式仍在執行

在 bash 或 vimscript 中,如何執行啟動應用程式(xv 或 display)的腳本,並透過將焦點傳回 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 中的檔案路徑作為要顯示的影像重新啟動檢視器。一切都與 vim 完全分離,我的 vim 腳本只是將檔案路徑寫入檔案 q,而從不引用檢視器應用程式 xp。

相關內容