Obtendo o caminho atual no comando EXEC do .desktop

6

Estou tentando fazer um arquivo .desktop executar um arquivo .sh, que está armazenado no mesmo diretório que o .desktop. Todo o diretório precisa ser portátil e movido de máquina para máquina.

meu script de execução é run.sh

Eu tentei:

[Desktop Entry]
Type=Application
Terminal=true
Name=RunMe
#Exec=sh -c "'dirname %k'/run.sh"
#Exec=bash -c "export PATH=$PATH:'dirname %k'; bash run.sh;"
#Exec=bash -c "export PATH=$PATH:'dirname %k'; sh run.sh;"
Exec=bash -c "export PATH=$PATH:'dirname %k'; run.sh;"

Mas nada acontece quando clico duas vezes no arquivo .desktop. Se eu clicar duas vezes em 'run.sh' e escolher 'run', o script é executado corretamente. Se eu executar o script a partir da linha de comando com ' sh run.sh ', tudo funcionará bem.

Alguma idéia, até mesmo como eu poderia depurar a qual caminho ela realmente está tentando fugir?

    
por Kiksy 14.07.2014 / 10:31

2 respostas

5

De acordo com a Especificação de entrada na área de trabalho :

Field codes must not be used inside a quoted argument

Consequentemente, seu %k é dado literalmente ao comando bash . Alterar a linha Exec para o seguinte evita isso:

Exec=bash -c '"$(dirname "$1")"/run.sh' dummy %k

O acima funciona localmente e também funciona se houver um espaço no caminho. dummy é dado ao script bash como seu $0 (o que ele acha que é o nome do script) e a expansão de %k está disponível como $1 . As camadas aninhadas de cotação são necessárias para estar em conformidade com a especificação e ser espaços seguros.

Observe que %k não necessariamente se expande para um caminho de arquivo local - pode ser um URI vfolder, ou vazio, e um script realmente portátil deve ser responsável por esses casos também. %k também não é universalmente suportado, então você precisará ter algumas restrições sobre os sistemas que espera usá-lo de qualquer maneira.

No que diz respeito à depuração, você pode usar o redirecionamento de shell comum no KDE:

Exec=bash -c ... > /tmp/desktop.log

Este não é um comportamento padronizado e não funciona no GNOME e provavelmente em outros. Você também pode fornecer um caminho absoluto para um script criado para registrar seus argumentos e ações da maneira que você precisa.

    
por 14.07.2014 / 11:03
1

Se o script estiver no mesmo diretório que o arquivo .desktop , apenas use os caminhos relativos. Não há motivo para mexer com bash -c ou modificar seu $PATH e muito menos dirname :

[Desktop Entry]
Type=Application
Terminal=true
Name=RunMe
Exec=./run.sh

Contanto que seu run.sh esteja no mesmo diretório que o arquivo .desktop e tenha uma linha shebang correta:

#!/usr/bin/env bash

Deve funcionar em qualquer lugar. Usar #!/usr/bin/env bash em vez de #!/bin/bash garante que qualquer bash no usuário $PATH seja usado e torne o script totalmente portátil.

NOTA: @MichaelHomer apontou nos comentários que caminhos relativos não funcionam em todos os ambientes de desktop. Eu tentei isso no Cinnamon e funcionou como esperado, então, presumivelmente, ele também deve funcionar em outros ambientes baseados no Gnome. As especificações do freedesktop.org parecem sugerir que um caminho completo deve ser usado:

The Exec key must contain a command line. A command line consists of an executable program optionally followed by one or more arguments. The executable program can either be specified with its full path or with the name of the executable only. If no full path is provided the executable is looked up in the $PATH environment variable used by the desktop environment. The name or path of the executable program may not contain the equal sign ("="). Arguments are separated by a space.

    
por 14.07.2014 / 15:20