Executa o executável com o xdg-open

2

Eu estou tentando escrever uma função launchSystemFile que funciona como o windows ShellExecuteEx da linha de comando ou do C ++.

Se eu ShellExecuteEx a blah.txt o abrir no editor padrão. Se eu ShellExecuteEx a firefox.exe , ele inicia o executável.

Eu tenho feito em C ++ popen "xdg-open blah" e funciona muito bem, exceto para executáveis.

Existe alguma maneira de fazer xdg-open executar um executável? Como o Firefox no caminho /usr/lib/firefox/firefox ?

Eu tentei xdg-open "/usr/lib/firefox/firefox" , mas isso falha com a mensagem de erro:

gvfs-open: /usr/lib/firefox/firefox: error opening location: No application is registered as handling this file

    
por Noitidart 27.01.2017 / 13:39

1 resposta

2

xdg-open é apenas um script de shell que detecta o Desktop Environment e chama o programa correspondente (gvfs-open para gnome, exo-open para XFCE, mate-open, etc.)

Portanto, as limitações para iniciar um executável são derivadas do launcher correspondente de cada DE, que é gvfs-open no seu caso.

Olhando para página de manual gvfs-open , este aplicativo ( semelhante aos outros aplicativos DE) apenas chama o aplicativo padrão registrado por tipo de arquivo, conforme definido por gvfs-mime settings.

No seu caso, o gvfs-open tenta (e falha) encontrar um aplicativo correspondente para iniciar um firefox file .

Se você executar o xdg-open (ou gvfs-open) com um link html como https://www.google.com , então deve funcionar corretamente; O gvfs-open pesquisará o banco de dados mime para descobrir como lidar com o link html, o mime irá avisar para chamar o firefox e o firefox será chamado.

Analisando as funções de script de shell xdg-open, há algumas funções que extraem a entrada Exec do arquivo .desktop correspondente e, em alguns ambientes de desktop, o comando encontrado na seção Exec do arquivo .desktop é executado é pelo xdg-open.

Em outras palavras, você não precisa chamar xdg-open ou gvfs-open para iniciar executáveis como o firefox.

Basta iniciar o "firefox" e deve ser executado (por exemplo,popen "/usr/bin/firefox")

PS: ou você pode até precisar chamar (exec firefox &)

Você pode até extrair entradas do Exec por todos os arquivos .desktop com um loop grep como este:

for file in "$(find /usr/share/applications/ -type f -name '*.desktop')"; do
executable=$(grep -m1 "^Exec=" <<<"$file") #some files have more than one Exec entries
echo "$file - $executable"
done
    
por 27.01.2017 / 15:47