Existe uma maneira de dizer a um programa x já em execução para abrir um arquivo do bash? (Isto é, sem invocar uma nova instância do programa.) Enquanto estou fazendo essa pergunta no contexto de xstata-mp
, estou interessado de forma mais geral se esse tipo de solução existe em geral para aplicativos Xorg.
Eu tenho um aplicativo x ( xstata-mp
, proprietário, que é importante para essa questão, como você aprenderá) que funciona muito bem. Consegui fazer um bom script de inicialização que primeiro verifica se xstata-mp
já está em execução e, se estiver, o traz para o primeiro plano e, de outra forma, o inicia. Muito parecido com a resposta aceita para esta pergunta .
Meu problema é que às vezes eu quero abrir um documento usado por xstata-mp
(por exemplo, um .dta
arquivo de dados, um arquivo de .do
script, um .sthlp
arquivo de ajuda, etc.). Se eu clicar duas vezes no ícone de tal arquivo, ou selecionar o ícone e clicar <ENTER>
enquanto xstata-mp
já estiver em execução, o script de inicialização é chamado (é referenciado na exec
parte do xstata-mp
arquivo .desktop
) e xstata-mp
é elevado ao topo das janelas visíveis, mas sem abrir o documento.
Pelo que vale, verificando com pidof
ele aparece que xstata-mp
não inicia um novo xstata-mp
processo se eu abrir vários documentos dentro dele (por exemplo, usando <CTRL>-O
); contraste com, digamos, Firefox
e várias guias/sites.
Aqui está o script de inicialização que eu gostaria de modificar:
# Check if xstata-mp v17 is running
exit_code_pidof_xstata_mp=$(pidof /usr/local/stata17/xstata-mp)
# if xstata-mp v17 IS NOT running, then launch it with argument $1
if [ -z "$exit_code_pidof_xstata_mp" ]
then
/usr/local/stata17/xstata-mp -q $1; exit >/dev/null
# but if xstata-mp v17 IS running, then bring it to front instead
else
wmctrl -ia "$(wmctrl -lp | grep "$(pgrep /usr/local/stata17/xstata-mp)" | tail -1 | awk '{ print $1 }')"; exit > /dev/null
fi
Antes de tudo, você deve descobrir o comando correto para abrir seu documento. Portanto, tente executar o seguinte comando e veja o que obtém.
Claro que esta é a parte crítica. E aqui você confia apenas na funcionalidade do seu programa. Se ele não oferece essa opção, bem, você não pode fazê-lo, porque tudo o que um bash pode fazer é iniciar outro programa . Do manual do usuário de 9,4 MB com 399 páginas que baixei da StataCorp LLC , não havia uma única dica sobre como usar
xstata-mp
.Talvez a
-q
opção já seja o que você deseja. Mas vamos supor que a opção correta de adicionar outro documento a uma instância já em execução dexstata-mp
seria-a
(como no VS Code:code -a
). Então tudo o que você precisa fazer é adicionar a seguinte linha abaixo de suaelse
declaração:Ele abriria seu documento e mostraria a janela atual agora.
SIM: Existe uma maneira de dizer a um programa x já em execução para abrir um arquivo do bash!
Então, seguindo uma dica do pessoal de suporte técnico da StataCorp, acontece que
xdotool
(que pode ser instalado comsudo apt install xdotool
o , se ainda não estiver no seu sistema) oferece uma solução exatamente para o tipo de problema na minha pergunta. Do site do projeto:Para resolver meu problema com
xdotool
, eu precisava criar umxdotool
script que estou chamandostatadoc.xdo
:Alguns comentários sobre este pequeno script:
/usr/bin/xdotool
, portanto, certifique-se de confirmar comwhich xdotool
ou similar."Stata/MP 17.0"
com a string fornecida acima. Isso é útil para que, por exemplo, atualizar a versão para 17.1 ou 18.x não interrompa o script. Osearch
comando identifica a janela do aplicativo X com a qual desejo fazer interface.xdotool
scripts aceitam argumentos, seguindo convençõesbash
-like$1
,$2
, etc.type
comando digita literalmente o texto fornecido - no meu caso, o conteúdo dos dois argumentos fornecidos$1
e$2
string na primeira janela (e no meu caso apenas) identificada pelosearch
comando na linha 2.key
comando envia um<ENTER>
(ou<RETURN>
se preferir) para a mesma janela do Stata.Agora vamos dar uma olhada no meu script de inicialização modificado, que chama
statadoc.xdo
da terceira para a última linha (adicionei uma seção na frente para reconhecer se o argumento fornecido indica tipos de arquivo Stata específicos - são necessários comandos de uso diferentes para lidar com cada um ... meu exemplo é não está completo, mas esses são os tipos de arquivo que uso na maioria dos meus trabalhos):Nota: Esta é uma solução para o Gnome rodando no Xorg.