![bash 或 vimscript,如何终止脚本但让它启动的应用程序仍在运行](https://linux22.com/image/1525098/bash%20%E6%88%96%20vimscript%EF%BC%8C%E5%A6%82%E4%BD%95%E7%BB%88%E6%AD%A2%E8%84%9A%E6%9C%AC%E4%BD%86%E8%AE%A9%E5%AE%83%E5%90%AF%E5%8A%A8%E7%9A%84%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E4%BB%8D%E5%9C%A8%E8%BF%90%E8%A1%8C.png)
在 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 而言)构成了我用来打开此项目的原始脚本,因此此脚本继续打开并等待,直到我关闭 vim 并让 xterm 死机,此时此调用脚本也会关闭。因此,这是一个方便的运行过程,什么也不做,而且就在我工作的目录中。我添加了其余代码,检查文件 q 是否存在,读取它并立即销毁它并终止查看器的任何正在运行的实例。然后使用文件 q 中的文件路径作为要显示的图像重新启动查看器。所有这些都与 vim 完全分离,我的 vimscript 只是将文件路径写入文件 q,从不引用查看器应用程序 xp。