Desktop-Dateien scheinen $ PATH nicht korrekt zu verwenden

13

Ich erstelle .desktopDateien zur Verwendung im Unity Launcher.

Ich habe meinen eigenen Speicherort in meinem Ausgangsverzeichnis, in dem ich meine ausführbaren Dateien ( ~/usr/bin/) ablege, die meiner PATHUmgebungsvariablen in meiner .pam_environmentDatei gemäß den Angaben in der entsprechenden Ubuntu-Dokumentation korrekt hinzugefügt wurden .

Dies ist der Inhalt meiner .pam_environmentDatei:

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/

Was dazu führt, dass meine PATHVariable wie folgt lautet:

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/

Ich weiß, dass es zweimal angehängt wird, aber alles in der .pam_environmentDatei scheint zweimal hinzugefügt zu werden, unabhängig davon, welche Syntax in der von mir angegebenen Ubuntu-Dokumentation empfohlen wird.

Dies ist ein Beispiel für das Problem (es tritt in allen Fällen auf). Ich habe ein Skript (genannt eclipse), in ~/usr/bin/dem Eclipse IDE ausgeführt wird.

Ich kann jedes Terminal öffnen und einfach tippen eclipseund es läuft einwandfrei, wie Sie es erwarten würden.

Aber bei Verwendung der folgenden .desktopDatei:

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

Ich erhalte den Fehler: Error

Aber wenn ich die Exec=Zeile ändere zu:

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

es funktioniert einwandfrei.

In der Dokumentation zu Official Unity Launchers und Desktop-Dateien wird empfohlen , dass dies funktioniert:

Exec ist der Pfad zur ausführbaren Datei. Der vollständige Pfad zur ausführbaren Datei darf nur verwendet werden, wenn er sich nicht in einem der in der Variablen $ PATH angegebenen Pfade befindet. Beispielsweise muss für alle Dateien im Pfad / usr / bin nicht der vollständige Pfad im Feld Exec angegeben werden, sondern nur der Dateiname.

Irgendwelche Vorschläge, was passiert?

BT
quelle
Ändern Sie Ihre Desktop-Datei, um Eclipse in einer Shell zu spielen, und es funktioniert möglicherweise. Ich konnte es nicht sagen, da ich vor einiger Zeit nicht mehr tragbar war.
RobotHumans

Antworten:

5

Die Tilde wird nicht .pam_environmentwie in einem Profilskript erweitert, und Desktop-Dateien erweitern die Shell- ExecZeilen nicht wie die Shell. ~/usr/bin/eclipseDaher wird nach einer Datei gesucht, die im wahrsten Sinne des Wortes benannt ist , was natürlich nicht der Fall ist. ' existiert nicht.

Ersetzen Sie die Tilde in der PATH-Zuweisung durch $ {HOME}, und es scheint zu funktionieren.

cscarney
quelle
Ihre Antwort ist richtig, das behebt das Problem vollständig. Vielen Dank! Haben Sie eine Idee, warum das Anhängen an das $PATHzweimal vorkommt , damit ich keine weitere Frage stelle ?
BT
1
Es ist ein Fehler: pad.lv/955032
cscarney
3

Was in der Ubuntu-Dokumentation gesagt wird, ist sinnvoll, jedoch fehlt der Abschnitt "Nicht mehr empfohlen" in einigen Details. Aus diesem Grund wird meine Antwort eine dieser Methoden beinhalten. Außerdem: Es wird bereits für genau denselben Zweck verwendet.

Besuchen Sie schnell Ihre ./.profile-Datei.

Meins enthält folgendes:

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

Wie Sie im letzten Abschnitt dieser Datei sehen können (in den Zeilen unter # wird PATH so gesetzt, dass der private Bin des Benutzers einbezogen wird, falls vorhanden), wird dies bereits ausgeführt. Wenn Sie also der Variablen $ PATH etwas hinzufügen möchten, tun Sie einfach dasselbe. In der Dokumentation wurde erwähnt, dass dies bei jedem Systemstart ausgeführt wird.

In Ihrem Fall müssen Sie nur Folgendes hinzufügen:

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

An diesem Punkt denke ich, dass der einzige Grund, warum diese Methode nicht mehr empfohlen wird, das Skripting beim Start ist, das sehr empfindlich für kleine Fehler ist. Wenn jedoch jemand mit so etwas arbeitet, kann ein kleiner Fehler einfach dadurch rückgängig gemacht werden, dass die Datei wieder in den ursprünglichen Zustand versetzt wird.

Wenn Sie nicht sicher sind, wie Sie dies tun sollen:

1) Drücken Sie zuerst STRG + ALT + F3

2) Melden Sie sich an, indem Sie der Eingabeaufforderung auf dem Bildschirm folgen

3) Geben Sie dies in die Eingabeaufforderung ein:

/usr/bin/nano ./.profile

4) entferne diese Zeilen: (wir haben sie gerade hinzugefügt)

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

5) drücke STRG + O (wie in Out)

6) drücke STRG + X (wie in eXit)

7) tippe exitund drücke ENTER (manchmal RETURN)

8) Drücken Sie jetzt STRG + ALT + F7

9) Sie sollten Ihren Anmeldebildschirm oder Desktop erhalten, je nachdem, wann das Problem aufgetreten ist. Wenn nicht, drücken Sie STRG + ALT + ENTF (manchmal STRG + ALT + ENTF) und Ihr System sollte sicher neu gestartet werden.

Hoffe das hilft!

JimmyC866
quelle
Beide Lösungen helfen, das Problem zu beheben, also danke :) Ich habe Sie beide positiv bewertet, aber @csarney erklärt den genauen Grund für das Problem und verwendet die in der Dokumentation empfohlene Methode zum Festlegen von Umgebungsvariablen. Daher habe ich dies als Lösung markiert.
BT