* .desktop nem symlink funciona (apenas para este arquivo) - Linux Mint 17.2 Cinnamon

2

Eu tenho esta entrada na área de trabalho:

[Desktop Entry]
Name=dummy
Type=Application
Terminal=false
Icon=/home/xyz/Software/Test/ico.png
Exec= /home/xyz/Software/Test/start

que deve executar o arquivo contendo:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./Linux/lib 
exec ./foo --gc=sgen

Eu tentei criar o symlink, mas o resultado é o mesmo - ele não faz nada. Quando clico duas vezes no arquivo em sua pasta, ele me avisa assim:

Depois de clicar em Run , ele é executado corretamente, mas ao executar a partir da área de trabalho ...

Eu tentei exportar esse caminho para o PATH, mas quando estou rodando foo , ele não consegue encontrar alguma biblioteca, mesmo que seja difícil ... Também o caminho está 100% correto, porque o ícone está aparecendo como deveria. / p>

O que estou tentando fazer é criar um atalho na área de trabalho do arquivo start , ou foo file (que não será executado sem erro por algum motivo, eu adicionei é caminho para PATH, talvez faltando argumento '- gc = sgen' ao executar?)

Qualquer ajuda será muito apreciada!

    
por RiddleMeThis 17.10.2015 / 23:15

1 resposta

3

O problema é que você está usando caminhos relativos no script: ./Linux/lib , ./foo . Esses caminhos são relativos ao diretório atual. O diretório atual do processo que está executando o script é o diretório atual de qualquer processo que o tenha lançado; Não tem nada a ver com a localização do script. Quando você executa o script clicando em um ícone da área de trabalho, o diretório atual é seu diretório pessoal.

Uma solução é adicionar um comando cd no script, para mudar para o diretório em que o aplicativo está instalado.

#!/bin/sh
cd /home/xyz/Software/Test/
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:./Linux/lib"
exec ./foo --gc=sgen

Mas seria mais útil não alterar o diretório atual e, em vez disso, usar caminhos absolutos. Dessa forma, você pode usar o script para abrir arquivos no diretório atual, por exemplo. Enquanto estou nisso, adicionei "$@" à invocação de foo , que transmite os argumentos na linha de comando do script para o aplicativo.

#!/bin/sh
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/home/xyz/Software/Test/Linux/lib"
exec /home/xyz/Software/Test/foo --gc=sgen "$@"

Se o script estiver localizado no diretório do aplicativo, você poderá detectar sua própria localização. $0 é o caminho para o script. ${0%/*} é o caminho para o script com tudo depois da última barra, ou seja, o caminho para o diretório que contém o script.

#!/bin/sh
foo_directory="${0%/*}"
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$foo_directory/lib"
exec "$foo_directory/foo" --gc=sgen "$@"

Tenha em atenção que, se LD_LIBRARY_PATH estiver inicialmente vazio, está a adicionar o diretório atual, o que pode não ser uma boa ideia. Você deveria testá-lo.

#!/bin/sh
foo_directory="${0%/*}"
if [ -n "$LD_LIBRARY_PATH" ]; then
  export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$foo_directory/lib"
else
  export LD_LIBRARY_PATH="$foo_directory/lib"
fi
exec "$foo_directory/foo" --gc=sgen "$@"

ou (supondo que você não use entradas vazias em LD_LIBRARY_PATH , o que é uma escolha sensata)

#!/bin/sh
foo_directory="${0%/*}"
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$foo_directory/lib"
LD_LIBRARY_PATH="${LD_LIBRARY_PATH#:}"
exec "$foo_directory/foo" --gc=sgen "$@"
    
por 17.10.2015 / 23:30