Pelo que pude reunir, .desktop
arquivos são atalhos que permitem personalizar as configurações do aplicativo. Por exemplo, tenho muitos na minha /usr/share/applications/
pasta.
Se eu abrir essa pasta nautilus
, posso executar esses aplicativos clicando duas vezes no arquivo associado, por exemplo, clicar duas vezes firefox.desktop
no Firefox. No entanto, não consigo encontrar uma maneira de fazer a mesma coisa via terminal.
Se eu fizer gnome-open foo.desktop
isso simplesmente abre foo.desktop
como um arquivo de texto. Se eu o tornar executável e executá-lo no bash, ele simplesmente falhará (o que é esperado, claramente não é o script do bash).
EDIT: Doing exec /fullpath/foo.desktop
me dá uma Permission denied
mensagem, mesmo que eu mude de propriedade. Se eu tornar o executável e executar o mesmo comando, a guia do terminal que estou usando simplesmente se fecha (acho que trava). Por fim, se o fizer sudo exec /fullpath/foo.desktop
, recebo um relatório de erros sudo: exec: command not found
.
Essa é a minha pergunta, como posso executar um foo.desktop
arquivo no terminal?
fonte
exec
falhou é porque o exec substitui o processo em execução pelo processo especificado, portanto, o que você fez foi tentar substituir o shell pela execução da área de trabalho como um binário compilado. A razão pela qual você não conseguiusudo exec
é porque é um shell embutido e não um comando binário.Respostas:
O comando que está sendo executado está contido no arquivo da área de trabalho, precedido por
Exec=
para que você possa extrair e executá-lo por:Para quebrar isso
Você pode colocar isso em um arquivo, digamos
~/bin/deskopen
com o conteúdoEm seguida, torne-o executável
E então você poderia fazer, por exemplo
Os argumentos (
%u
,%F
etc) estão detalhados em http://standards.freedesktop.org/desktop-entry-spec/desktop-entry-spec-1.0.html#exec-variables - nenhum deles é relevante para iniciar na linha de comando .fonte
grep '^Exec' firefox.desktop | sed 's/^Exec=//'
abrir o Firefox com uma guia que carrega www.% U.com .sed
para remover qualquer argumento. Mas acho que pode haver uma maneira mais "natural" de executá-lo..desktop
arquivos simples , mas ignora entradas comoPath=
eTryExec=
que podem afetar a execução. Ele também executa o erradoExec=
se o arquivo contém ações da área de trabalho ( "quicklists")A resposta deve ser
Mas devido a um bug, isso não funciona mais.
fonte
exo-open
está listado como solução alternativa e também abre o gedit. :(gnome-open
se não chamarxdg-open
, é o contrário! Assim, a questão reside nagvfs-open
(o sucessor ougnome-open
)xdg-open
funciona por associação mimetype e.desktop
arquivos estão associados com editores de texto, uma vez que são uma subclasse de textoCom qualquer ubuntu recente que suporte
gtk-launch
simplesmente vágtk-launch <file>
onde é o nome do arquivo .desktop com ou sem a.desktop
parteEntão
gtk-launch foo
abrefoo.desktop
(
gtk-launch
documentação )O .desktop deve estar em / usr / share / applications, / usr / local / share / applications ou ~ / .local / share / applications
Utilizável a partir do terminal ou alt + F2 (alt + F2 armazena o comando no histórico tão facilmente acessível)
fonte
A partir de hoje (12.10) o bug ainda está presente. De fato, depende de como
gvfs-open
(chamado porxdg-open
) funciona.Ainda assim, consegui uma solução rápida (roubando inspiração do código-fonte do nautilus). É um pouco complicado, mas funciona perfeitamente no Ubuntu 12.10, adicionando um ícone significativo (não mais
?
) no iniciador do Unity.Primeiro, escrevi um script python usando Gio e coloquei o salvo como
~/bin/run-desktop
:O script precisa ter a permissão executável, então eu executei isso em um terminal:
Então eu criei a
.desktop
entrada relativa em~/.local/share/applications/run-desktop.desktop
:Finalmente eu associada a entrada como o manipulador padrão em
~/.local/share/applications/mimeapps.list
sob a[Default Applications]
seção como:Agora:
xdg-open
something.desktop funciona como esperado#!/usr/bin/xdg-open
hashbang em cima de uma entrada executável da área de trabalho também funcionaSerá um trabalho inútil quando
gvfs-open
resolverá o erro, mas enquanto isso ...fonte
Exec=
linhas e%
parâmetros no comando corretamente./usr/bin/xdg-openpy
, e dei umchmod +x
- e usei emlauncher.launch([],context)
vez de...None,context)
(por causa de " TypeError: argumento 1: deve ser sequência, não NoneType "). Agoraxdg-openpy app.desktop
funciona a partir da linha de comando (e tudo normal ao clicar duas vezesapp.desktop
), e isso pode me lembrar se eu tentar ligar para o terminalxdg-open
e pressionar tab. Felicidades!.desktop
arquivo, por isso é a abordagem mais sensata (e segura). Também usa moderno emgi.repository
vez do obsoletopygtk
, ótimo! :)O Caminho Certo
Você realmente deveria estar usando
gtk-launch
se estiver disponível. Geralmente faz parte do pacote libgtk-3-bin (isso pode variar de acordo com a distribuição).gtk-launch
é usado da seguinte maneira:Observe que
gtk-launch
requer que o arquivo .desktop seja instalado (ou seja, localizado em/usr/share/applications
ou~/.local/share/applications
).Portanto, para contornar isso, podemos usar uma pequena função Bash que instala temporariamente o arquivo .desktop desejado antes de iniciá-lo. A maneira "correta" de instalar um arquivo .desktop é via
desktop-file-install
mas eu vou ignorá-lo.Você pode usá-lo assim (e também transmitir argumentos adicionais ou URIs, se desejar):
A alternativa manual
Se você deseja analisar e executar manualmente um arquivo .desktop , pode fazê-lo com o seguinte
awk
comando:Se você deseja tratar o
awk
comando como um script all-in-one; podemos até mostrar uma mensagem de erro e sair com um código de retorno 1 no caso de um comando Exec não ser encontrado:Os comandos acima mencionados:
%f
,%u
,%U
). É possível substituí-los por argumentos posicionais, conforme a especificação pretende, mas isso adicionaria complexidade significativa ao problema. Consulte a última especificação de entrada da área de trabalho .Observe que esse script AWK aborda alguns casos extremos que podem ou não ser tratados adequadamente por algumas das outras respostas. Especificamente, esse comando remove várias variáveis Exec (tomando cuidado para não remover o símbolo%), executará apenas um único comando de linha Exec e se comportará conforme o esperado, mesmo que o comando Exec line contenha um ou mais sinais de igual (por exemplo
script.py --profile=name
).Apenas algumas outras advertências ... De acordo com a especificação, o TryExec é:
Com isso em mente, não faz sentido executar seu valor.
Algumas outras preocupações são Caminho e Terminal . O caminho consiste no diretório de trabalho para executar o programa. Terminal é um booleano que indica se o programa é executado em uma janela de terminal. Tudo isso pode ser resolvido, mas não há sentido em reinventar a roda, pois já existem implementações da especificação. Se você deseja implementar o Path , lembre-se de que
system()
gera um subprocesso, para que você não possa alterar o diretório de trabalho fazendo algo parecidosystem("cd \047" working_directory "\047"); system(command)
. No entanto, você provavelmente poderia fazer algo assimsystem("cd \047" working_directory "\047 && " command)
. Nota \ 047 são aspas simples (portanto, o comando não quebra nos caminhos com espaços).A Alternativa Python
Estou roubando uma página de Carlo aqui , que sugeriu a criação de um script Python para usar o módulo gi . Aqui está uma maneira mínima de executar o mesmo código do shell sem precisar criar um arquivo e se preocupar com E / S.
Em seguida, execute a função do iniciador da seguinte maneira:
Observe que o uso de URIs é opcional. Além disso, nenhuma verificação de erro é realizada, portanto, você deve garantir que o iniciador exista e seja legível (antes de usá-lo) se desejar que seu script seja durável.
fonte
awk
comando é bom. Portanto, +1awk
solução não funcionará corretamente se o comando tiver espaços em branco de escape duplo ou barras invertidas. Ele quebra com isso:Exec=env WINEPREFIX="/path/to/.wine" wine c:\\\\windows\\\\command\\\\start.exe /Unix /path/to/.wine/dosdevices/c:/users/Public/Рабочий\\ стол/appname.lnk
e adex
solução funciona bem.Enquanto o OP não estava perguntando sobre o KDE, para quem está executando o KDE, o seguinte comando pode ser usado:
kioclient exec <path-to-desktop-file>
No Fedora, isso está incluído no
kde-runtime
rpm.fonte
Você poderia usar dex .
fonte
.desktop
arquivos escritos à mão . E também pode criar.desktop
arquivos, sim ! :-)parece funcionar na versão 13.10, se o exo-utils estiver instalado (como é o caso do Xubuntu).
fonte
Adendo à resposta de Hamish.
Dado o script deskopen, você pode usar uma referência a ele como a linha shebang em um arquivo .desktop , pois o caractere de comentário ainda é
#
. Ou seja, coloque isso como a primeira linha do arquivo .desktop :Em seguida, sinalize o arquivo .desktop como executável (por exemplo, com a
chmod +x whatever.desktop
) e, em seguida, você podee voilà - O aplicativo será aberto! (Complete com o arquivo de ícone que eu especifiquei, embora não tenha ideia de como.)
Agora, se você também deseja que o deskopen passe por qualquer parâmetro da linha de comando, use esta versão ligeiramente modificada:
Como um aparte, tentei usar em
"#{@:2}"
vez deshift
ing, mas ele continuava me dando 'má substituição' ...fonte
"${@:1}"
vez deshift
, mas isso requer embash
vez desh
no seu#!
shebang. IMHO sua abordagem mudança original está mais simples e melhorAtualmente, não há um aplicativo que faça o que você descreve nos arquivos do Ubuntu. Há alguns esforços em andamento para criar uma solução geral para fornecer integração para ambientes de desktop (como o openbox) que não sejam compatíveis com essas especificações XDG.
O Arch Linux está trabalhando na implementação do xdg-autostart com base nas bibliotecas python-xdg. Pelo que pude encontrar, isso ainda não parece totalmente completo, mas tem alguns relatos de sucesso.
Há também uma implementação em C ++ do xdg-autostart no gitorious (http://gitorious.org/xdg-autostart/) que provavelmente se beneficiaria de um uso mais amplo.
Se alguma solução funcionar para você, por favor, considere enviar o trabalho necessário para inclusão no Debian ou no Ubuntu.
Para usar qualquer ferramenta com o openstart, chame-o em /etc/xdg/openbox/autostart.sh (se estiver lendo a documentação do openbox corretamente). Se isso não funcionar, você provavelmente poderá chamá-lo em qualquer um dos scripts de inicialização da sessão do openbox.
fonte
Não tenho uma solução imediata que atenda ao requisito de "usar um comando padrão" , mas se você deseja analisar minimamente os
.desktop
arquivos ou criar um alias do Bash, o seguinte deve funcionar:awk -F= '/Exec=/{system($2); exit}' foo.desktop
Outra abordagem que pode ser interessante seria criar um
binfmt-misc
método no nível do kernel que corresponda aos.desktop
arquivos (vejagrep -r . /proc/sys/fs/binfmt_misc/
os padrões que você ativou atualmente).No final do dia, algo em algum lugar terá que analisar os
.desktop
arquivos, é apenas uma questão de quão "padrão / padrão" é esse.fonte
awk
vez de uma cadeia degrep
s esed
s.Exec=
linhas: /Peguei o script da resposta de Carlo acima e tentei aprimorá-lo para meu próprio uso na área de trabalho.
Esta versão do script permitirá executar qualquer aplicativo como se você o tivesse inserido no HUD, desde que seja o primeiro resultado. Também permite passar argumentos de arquivo para arquivos .desktop que não oferecem suporte a URIs.
fonte
Ao tentar testar esses arquivos, achei a maneira mais simples de verificar se o DM ou o gerenciador de sessões faria o que eu esperava abrir o diretório circundante em um navegador de pastas da interface do usuário e clique duas vezes para abri-los.
Se você estiver em uma linha de comando:
gvfs-open .
ougnome-open .
a abrirá no navegador de pastas configurado.A coisa sed não espelha o comportamento do Mestre, incluindo coisas complicadas, como escapadas e citações, nas quais você realmente não gostaria de comportamento alternativo. Não é uma linha de comando, mas validou as coisas. Também achei a configuração
Terminal=true
útil para depuração.fonte
Essa resposta do SO é o que deixou claro para mim: não tente executar o arquivo da área de trabalho, execute o arquivo apontado no arquivo da área de trabalho.
Por exemplo, execute /home/jsmith/Desktop/x11vnc.sh
fonte
(Compilado a partir de várias outras respostas aqui)
Dependendo do seu sistema e dos vários erros que podem ou não existir no seu sistema, tente o seguinte até que um deles funcione:
xdg-open program_name.desktop
exo-open program_name.desktop
gtk-launch program_name.desktop
kioclient exec program_name.desktop
dex program_name.desktop
Observe que nos sistemas Ubuntu, os ativadores de área de trabalho do "menu Iniciar" estão disponíveis no
/usr/share/applications/
.Como exemplo, para mostrar quais dos comandos acima funcionam ou não no meu sistema Ubuntu 14.04, eis os resultados das seguintes chamadas para mim:
xdg-open /usr/share/applications/eclipse_for_cpp.desktop
# Falha devido a erro (tenta me salvar este arquivo .desktop)exo-open /usr/share/applications/eclipse_for_cpp.desktop
# Trabalhogtk-launch /usr/share/applications/eclipse_for_cpp.desktop
# Falha com "gtk-launch: no application"kioclient exec /usr/share/applications/eclipse_for_cpp.desktop
# Trabalhodex /usr/share/applications/eclipse_for_cpp.desktop
# Falha, esudo apt install dex
não é possível localizar o pacote dexfonte
Verifique se o script para o qual o arquivo da área de trabalho aponta também é executável.
Se ainda não funcionar. Torne o arquivo da área de trabalho executável no terminal alterando-o
Terminal=true
e coloque-o dentro de um script bash. Execute o script para capturar a saída do erro. Mude de volta quando os erros forem corrigidos.fonte
A resposta de Hamish é ótima, mas eu gostaria de sugerir uma alternativa mais simples, com menos tubulações envolvidas:
$(awk -F= '/^Exec/||/^TryExec/ {print $2;exit}' /usr/share/applications/firefox.desktop)
Nesse caso,
awk
procura por uma linha que comece comExec
e, em seguida, simplesmente imprimimos campos após essa linha, usando o loop for e=
imprimimos o campo 2, ou seja, o que vier depois desse campo. Os colchetes nas extremidades dos comandos,$(...)
são substituições de parâmetros, portanto o shell executará o que o comando awk retornar; nesse caso, ele retorna o comando real que vem depoisExec=
.Em alguns casos raros, pode haver mais de um
=
sinal, o que ainda é uma possibilidade. Por isso, sugirofonte
awk
e Serg =)TryExec
, talvez você deve verificar o seu 2º comando =)awk
é a minha arma de escolha quando se trata de processamento de texto. Além disso, sua sintaxe está próximaC
. Ah, e já adicionouTryExec
parte ^ _ ^%f
,%u
,%U
ou algo assim para trás o comando?