
No bash ou no vimscript, como posso executar um script que inicia um aplicativo (xv ou display) e terminar o script retornando o foco para o vim, mas deixando o xv/display ainda em execução. Meu esforço atual é esta função vim, que é essencialmente uma versão direcionada ao vim da minha tentativa no bash. Ele trava no último comando até eu sair da exibição.
" 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 é appname, a:k é o parâmetro de posição da tela, @u é o caminho do arquivo
Responder1
Um script bash típico seria parecido com
#!/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" &
Responder2
O problema é que não dá para dissociar um aplicativo do processo que o lançou, a solução, que funciona para mim, é ter algum outro processo, já em execução, fazendo isso por mim. Aqui está minha solução:
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
Os três primeiros comandos, para o xterm, compõem o script original que usei para abrir este projeto, então este script continuou aberto e esperando até o momento em que fechei o vim e deixei o xterm morrer, momento em que este script de chamada fecharia também . Então aqui estava um processo de execução útil, sem fazer nada, e no mesmo diretório em que eu estava trabalhando. Adicionei o resto do código, que verifica a existência de um arquivo q, lê-o e imediatamente o destrói e mata qualquer instância em execução do espectador. em seguida, reinicia o visualizador usando o caminho do arquivo q como a imagem a ser mostrada. Tudo completamente dissociado do vim, onde meu vimscript apenas escreve o caminho do arquivo para o arquivo q e nunca faz referência ao aplicativo visualizador, xp.