AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / ubuntu / Perguntas / 1394019
Accepted
Lexible
Lexible
Asked: 2022-02-21 12:32:14 +0800 CST2022-02-21 12:32:14 +0800 CST 2022-02-21 12:32:14 +0800 CST

Abra o documento em um aplicativo Xorg já iniciado a partir do bash

  • 772

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-mpjá 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 .dtaarquivo de dados, um arquivo de .doscript, um .sthlparquivo de ajuda, etc.). Se eu clicar duas vezes no ícone de tal arquivo, ou selecionar o ícone e clicar <ENTER>enquanto xstata-mpjá estiver em execução, o script de inicialização é chamado (é referenciado na execparte do xstata-mparquivo .desktop) e xstata-mpé elevado ao topo das janelas visíveis, mas sem abrir o documento.

Pelo que vale, verificando com pidofele aparece que xstata-mp não inicia um novo xstata-mpprocesso se eu abrir vários documentos dentro dele (por exemplo, usando <CTRL>-O); contraste com, digamos, Firefoxe 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
bash
  • 2 2 respostas
  • 60 Views

2 respostas

  • Voted
  1. mark
    2022-02-21T14:13:50+08:002022-02-21T14:13:50+08:00

    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.

    /usr/local/stata17/xstata-mp --help
    

    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 -qopçã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 de xstata-mpseria -a(como no VS Code: code -a). Então tudo o que você precisa fazer é adicionar a seguinte linha abaixo de sua elsedeclaração:

    /usr/local/stata17/xstata-mp -a "$1"
    

    Ele abriria seu documento e mostraria a janela atual agora.

    • 1
  2. Best Answer
    Lexible
    2022-02-24T16:15:21+08:002022-02-24T16:15:21+08:00

    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 com sudo apt install xdotoolo , 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:

    xdotoolpermite simular a entrada do teclado e a atividade do mouse, mover e redimensionar janelas, etc. Ele faz isso usando a extensão XTEST do X11 e outras funções do Xlib.

    ⚠️ Nota: Se você estiver usando Wayland, esteja ciente de que este software não funcionará corretamente. ⚠️

    Com xdotool, você pode pesquisar janelas e mover, redimensionar, ocultar e modificar propriedades da janela, como o título. Se o seu gerenciador de janelas suportar, você pode usar xdotoolpara alternar áreas de trabalho, mover janelas entre áreas de trabalho e alterar o número de áreas de trabalho.

    Para resolver meu problema com xdotool, eu precisava criar um xdotoolscript que estou chamando statadoc.xdo:

    #!/usr/bin/xdotool
    search --name "Stata/MP"
    type --window %1 '$1 ' '$2'
    key --window %1 Return
    

    Alguns comentários sobre este pequeno script:

    1. O caminho pode ser algo diferente de /usr/bin/xdotool, portanto, certifique-se de confirmar com which xdotoolou similar.
    2. A segunda linha corresponderá parcialmente ao nome "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. O searchcomando identifica a janela do aplicativo X com a qual desejo fazer interface.
    3. xdotoolscripts aceitam argumentos, seguindo convenções bash-like $1, $2, etc.
    4. O typecomando digita literalmente o texto fornecido - no meu caso, o conteúdo dos dois argumentos fornecidos $1e $2string na primeira janela (e no meu caso apenas) identificada pelo searchcomando na linha 2.
    5. O keycomando 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.xdoda 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):

    # Check whether there IS NOT an argument. If not, do nothing.
    if [ -z "$1" ]
      then
        break
     # Otherwise, set prefix to default value, and then check 
     # whether file name ends in .hlp, .sthlp, .ado, .do, or .gph
     else
      prefix="use "
      if [ ${1##*.} = "hlp" ] || [ ${1##*.} = "sthlp" ] || [ ${1##*.} = "ado" ] || [ ${1##*.} = "do"  ]
        then
          # If the filename DOES end in one of those four prefixes then
          # change prefix to "doedit" so Stata opens the document with 
          # the do-file editor.
          prefix="doedit "
        fi
      # If the filename ends in .gph, then change prefix to "doedit" so 
      # Stata opens the document with the graph viewer/editor.
      if [ ${1##*.} = "gph" ]
        then
          prefix="graph use "
        fi
      break
      fi
    
    # 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
      # First, call statadoc.xdo with the prefix as the first argument, 
      # and the supplied file path as the second argument 
      /usr/share/stata17/bin/statadoc.xdo "$prefix" " $1"
      wmctrl -ia "$(wmctrl -lp | grep "$(pgrep /usr/local/stata17/xstata-mp)" | tail -1 | awk '{ print $1 }')"; exit > /dev/null
      fi
    

    Nota: Esta é uma solução para o Gnome rodando no Xorg.

    • 0

relate perguntas

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Existe um comando para listar todos os usuários? Também para adicionar, excluir, modificar usuários, no terminal?

    • 9 respostas
  • Marko Smith

    Como excluir um diretório não vazio no Terminal?

    • 4 respostas
  • Marko Smith

    Como descompactar um arquivo zip do Terminal?

    • 9 respostas
  • Marko Smith

    Como instalo um arquivo .deb por meio da linha de comando?

    • 11 respostas
  • Marko Smith

    Como instalo um arquivo .tar.gz (ou .tar.bz2)?

    • 14 respostas
  • Marko Smith

    Como listar todos os pacotes instalados

    • 24 respostas
  • Martin Hope
    Flimm Como posso usar o docker sem sudo? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    led-Zepp Como faço para salvar a saída do terminal em um arquivo? 2014-02-15 11:49:07 +0800 CST
  • Martin Hope
    ubuntu-nerd Como descompactar um arquivo zip do Terminal? 2011-12-11 20:37:54 +0800 CST
  • Martin Hope
    TheXed Como instalo um arquivo .deb por meio da linha de comando? 2011-05-07 09:40:28 +0800 CST
  • Martin Hope
    Ivan Como listar todos os pacotes instalados 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    David Barry Como determino o tamanho total de um diretório (pasta) na linha de comando? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher "Os seguintes pacotes foram retidos:" Por que e como resolvo isso? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford Como os PPAs podem ser removidos? 2010-07-30 01:09:42 +0800 CST

Hot tag

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve