Os arquivos da área de trabalho parecem não usar o $ PATH corretamente


13

Estou criando .desktoparquivos para uso no Unity Launcher.

Eu tenho meu próprio local no diretório inicial, onde coloco meus executáveis ​​( ~/usr/bin/), que são adicionados corretamente à minha PATHvariável de ambiente no meu .pam_environmentarquivo, conforme especificado na documentação relevante do Ubuntu .

Este é o conteúdo do meu .pam_environmentarquivo:

LANGUAGE=en_AU:en_GB:en
LANG=en_AU.UTF-8
LC_NUMERIC=en_AU.UTF-8
LC_TIME=en_AU.UTF-8
LC_MONETARY=en_AU.UTF-8
LC_PAPER=en_AU.UTF-8
LC_NAME=en_AU.UTF-8
LC_ADDRESS=en_AU.UTF-8
LC_TELEPHONE=en_AU.UTF-8
LC_MEASUREMENT=en_AU.UTF-8
LC_IDENTIFICATION=en_AU.UTF-8

PATH DEFAULT=${PATH}:~/usr/bin/

O que resulta na minha PATHvariável da seguinte forma:

ben@ben-HPdv6:~$ echo $PATH
/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:~/usr/bin/:~/usr/bin/

Eu sei que ele é anexado duas vezes, mas qualquer coisa no .pam_environmentarquivo parece ser adicionada duas vezes, independentemente do uso da sintaxe correta recomendada na documentação do Ubuntu que eu referenciei.

Este é um exemplo do problema (acontece com todos os casos). Eu tenho um script (chamado eclipse) no ~/usr/bin/qual executa o Eclipse IDE.

Eu posso abrir qualquer terminal e simplesmente digitar eclipsee ele funciona bem como você esperaria.

Mas ao usar o seguinte .desktoparquivo:

#!/usr/bin/env xdg-open

[Desktop Entry]
Version=1.0
Type=Application
Terminal=false
Name=Eclipse - Juno (4.2)
Icon=/home/ben/.icons/eclipse.svg
Exec=eclipse

Eu recebo o erro: Erro

Mas quando eu mudo a Exec=linha para:

Exec=/home/ben/usr/bin/eclipse

funciona perfeitamente.

A documentação dos arquivos oficiais dos lançadores da unidade e da área de trabalho sugere que isso funcione:

Exec é o caminho para o arquivo executável. O caminho completo para o arquivo executável deve ser usado apenas no caso de não estar em nenhum dos caminhos especificados na variável $ PATH. Por exemplo, todos os arquivos que estão dentro do caminho / usr / bin não precisam ter o caminho completo especificado no campo Exec, mas apenas o nome do arquivo.

Alguma sugestão sobre o que está acontecendo?


Modifique seu arquivo da área de trabalho para diverti-lo em um shell e ele pode funcionar. Eu não sabia dizer desde que parei de usar o portátil há algum tempo.
RobotHumans

Respostas:


5

O til não é expandido .pam_environmentda mesma forma que em um script de perfil, e os arquivos da área de trabalho não fazem a expansão do shell em suas Execlinhas da mesma forma que o shell, então está procurando um arquivo que literalmente seja nomeado ~/usr/bin/eclipse, o que obviamente não acontece ' não existe.

Substitua o til na atribuição PATH por $ {HOME} e ele parece funcionar.


Sua resposta está correta, isso resolve o problema completamente. Obrigado! Para me salvar fazendo outra pergunta, você tem alguma idéia de por que anexar ao que $PATHacontece duas vezes?
BT

1
É um bug: pad.lv/955032
cscarney

3

O que é dito na documentação do Ubuntu faz sentido, no entanto, sua seção "não é mais recomendada" está faltando em alguns detalhes. Por esse motivo, minha resposta envolverá o uso de um desses métodos. Além disso: ele já é usado exatamente para esse mesmo objetivo.

Faça uma rápida visita ao seu arquivo ./.profile.

O meu contém o seguinte:

# ~/.profile: executed by the command interpreter for login shells.
# This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login
# exists.
# see /usr/share/doc/bash/examples/startup-files for examples.
# the files are located in the bash-doc package.

# the default umask is set in /etc/profile; for setting the umask
# for ssh logins, install and configure the libpam-umask package.
#umask 022

# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
    . "$HOME/.bashrc"
    fi
fi

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

Como você pode ver na última seção deste arquivo (linhas abaixo de # set PATH, para incluir o compartimento privado do usuário, se ele existir), isso já está sendo feito. Portanto, se você quiser adicionar algo à variável $ PATH, basta fazer a mesma coisa. A documentação mencionou que isso será executado toda vez que o sistema for iniciado.

No seu caso, tudo o que você precisa fazer é adicionar isto:

# set PATH to custom variable (this line is not needed)
if [ -d "$HOME/usr/bin" ]; then
    PATH="$HOME/usr/bin:$PATH"
fi

Neste ponto, estou começando a pensar que a única razão pela qual esse método não é mais recomendado é que ele envolve scripts na inicialização, o que é muito sensível a pequenos erros. Quando alguém está trabalhando com algo assim, no entanto, um pequeno erro pode ser desfeito simplesmente mudando o arquivo para o estado anterior.

Se você não tiver certeza de como fazer isso:

1) Primeiro, pressione CTRL + ALT + F3

2) Faça o login seguindo o prompt na tela

3) Digite isso no prompt de comando:

/usr/bin/nano ./.profile

4) remova estas linhas: (nós apenas as adicionamos)

# set PATH to custom variable (this line is not needed)
if [ -d "$HOME/usr/bin" ]; then
    PATH="$HOME/usr/bin:$PATH"
fi

5) pressione CTRL + O (como em Saída)

6) pressione CTRL + X (como no eXit)

7) digite exite pressione ENTER (às vezes RETURN)

8) agora pressione CTRL + ALT + F7

9) Você deve ter sua tela de login ou desktop, dependendo de quando o problema ocorreu. Caso contrário, pressione CTRL + ALT + DEL (às vezes CTRL + ALT + DELETE) e seu sistema deverá reiniciar com segurança.

Espero que isto ajude!


Ambas as soluções funcionam para corrigir o problema, então, obrigado :) Eu votei em ambos, mas o @csarney explica o motivo exato do problema e usa o método de configuração de variável de ambiente recomendado na documentação, então marquei isso como a solução.
BT
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.