Les fichiers du bureau ne semblent pas utiliser correctement $ PATH

13

Je crée des .desktopfichiers à utiliser dans Unity Launcher.

J'ai mon propre emplacement dans mon répertoire personnel où je mets mes exécutables ( ~/usr/bin/) qui sont correctement ajoutés à ma PATHvariable d'environnement dans mon .pam_environmentfichier comme spécifié dans la documentation Ubuntu pertinente .

Voici le contenu de mon .pam_environmentdossier:

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/

Ce qui fait que ma PATHvariable est la suivante:

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/

Je sais qu'il est ajouté deux fois, mais tout ce qui se trouve dans le .pam_environmentfichier semble être ajouté deux fois, quelle que soit l'utilisation de la syntaxe correcte recommandée dans la documentation Ubuntu que j'ai référencée.

Ceci est un exemple du problème (cela se produit dans tous les cas). J'ai un script (appelé eclipse) dans ~/usr/bin/lequel s'exécute Eclipse IDE.

Je peux ouvrir n'importe quel terminal et simplement taper eclipseet cela fonctionne bien comme vous vous en doutez.

Mais lors de l'utilisation du .desktopfichier suivant :

#!/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

Je reçois l'erreur: Erreur

Mais quand je change la Exec=ligne en:

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

cela fonctionne parfaitement.

La documentation officielle des lanceurs Unity et des fichiers de bureau suggère que cela devrait fonctionner:

Exec est le chemin d'accès au fichier exécutable. Le chemin complet du fichier exécutable ne doit être utilisé qu'au cas où il ne se trouve dans aucun des chemins spécifiés dans la variable $ PATH. Par exemple, tous les fichiers qui se trouvent dans le chemin / usr / bin n'ont pas besoin que leur chemin complet soit spécifié dans le champ Exec, mais seulement leur nom de fichier.

Des suggestions sur ce qui se passe?

BT
la source
Modifiez votre fichier de bureau pour l'éclipse amusante dans un shell et cela peut fonctionner. Je ne pourrais pas le dire depuis que j'ai cessé d'utiliser le portable il y a quelque temps.
RobotHumans

Réponses:

5

Le tilde n'est pas développé .pam_environmentcomme il le ferait dans un script de profil, et les fichiers de bureau ne font pas d'expansion du shell sur leurs Execlignes comme le ferait le shell, donc il recherche un fichier qui porte un nom littéral ~/usr/bin/eclipse, ce qui bien sûr ne le fait pas. n'existe pas.

Remplacez le tilde dans l'affectation PATH par $ {HOME} et cela semble fonctionner.

cscarney
la source
Votre réponse est correcte, cela résout entièrement le problème. Merci! Pour éviter de poser une autre question, avez-vous une idée de la raison pour laquelle l'ajout à l'événement se $PATHproduit deux fois?
BT
1
C'est un bug: pad.lv/955032
cscarney
3

Ce qui est dit sur la documentation Ubuntu a du sens, mais sa section "plus recommandé" manque de détails. Pour cette raison, ma réponse impliquera d'utiliser l'une de ces méthodes. Aussi: il est déjà utilisé dans ce même but.

Visitez rapidement votre fichier ./.profile.

Le mien contient ceci:

# ~/.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

Comme vous pouvez le voir dans la dernière section de ce fichier (les lignes ci-dessous # définissent PATH pour qu'il inclue le bac privé de l'utilisateur s'il existe), cela est déjà en cours. Donc, si vous vouliez ajouter quelque chose à la variable $ PATH, vous feriez simplement la même chose. La documentation mentionne que cela sera exécuté à chaque démarrage du système.

Dans votre cas, il vous suffit d'ajouter ceci:

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

À ce stade, je commence à penser que la seule raison pour laquelle cette méthode n'est plus recommandée est qu'elle implique des scripts au démarrage, ce qui est très sensible aux légères erreurs. Cependant, lorsque quelqu'un travaille avec quelque chose comme ça, une petite erreur peut être annulée simplement en remettant le fichier dans sa forme d'origine.

Si vous ne savez pas comment procéder:

1) Tout d'abord, appuyez sur CTRL + ALT + F3

2) Connectez-vous en suivant l'invite à l'écran

3) Tapez ceci dans l'invite de commande:

/usr/bin/nano ./.profile

4) supprimez ces lignes: (nous venons de les ajouter)

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

5) appuyez sur CTRL + O (comme dans Out)

6) appuyez sur CTRL + X (comme dans eXit)

7) tapez exitet appuyez sur ENTREE (parfois RETOUR)

8) appuyez maintenant sur CTRL + ALT + F7

9) Vous devriez obtenir votre écran de connexion ou votre bureau, selon le moment où le problème s'est produit. Sinon, appuyez sur CTRL + ALT + SUPPR (parfois CTRL + ALT + SUPPR) et votre système devrait redémarrer en toute sécurité.

J'espère que cela t'aides!

JimmyC866
la source
Les deux solutions fonctionnent pour résoudre le problème, alors merci :) Je vous ai tous les deux voté mais @csarney explique la raison exacte du problème et utilise la méthode de réglage des variables d'environnement recommandée dans la documentation, j'ai donc marqué cela comme la solution.
BT