Soweit ich weiß, handelt es sich bei .desktop
Dateien um Verknüpfungen, mit denen die Einstellungen der Anwendung angepasst werden können. Zum Beispiel habe ich viele davon in meinem /usr/share/applications/
Ordner.
Wenn ich diesen Ordner öffne, nautilus
kann ich diese Anwendungen ausführen, indem ich einfach auf die zugehörige Datei doppelklicke, z firefox.desktop
. Ich kann jedoch keine Möglichkeit finden, dasselbe über das Terminal zu tun.
Wenn ich es tue gnome-open foo.desktop
, öffnet es sich einfach foo.desktop
als Textdatei. Wenn ich es ausführbar mache und es dann in Bash ausführe, schlägt es einfach fehl (was erwartet wird, es ist eindeutig kein Bash-Skript).
EDIT: Wenn ich das tue, exec /fullpath/foo.desktop
bekomme ich eine Permission denied
Nachricht, auch wenn ich den Besitzer selbst wechsle. Wenn ich ausführbar mache und den gleichen Befehl ausführe, wird der von mir verwendete Terminal-Tab einfach geschlossen (ich vermute, er stürzt ab). Wenn ich das tue sudo exec /fullpath/foo.desktop
, erhalte ich schließlich eine Fehlermeldung sudo: exec: command not found
.
Das ist meine Frage, wie kann ich eine foo.desktop
Datei vom Terminal ausführen ?
quelle
exec
Fehler aufgetreten ist, ist, dass exec Ihren aktuell ausgeführten Prozess durch den von Ihnen angegebenen Prozess ersetzt. Sie haben also versucht, Ihre Shell durch das Ausführen des Desktops als kompilierte Binärdatei zu ersetzen. Der Grund, warum Sie das nicht konnten,sudo exec
ist, dass es sich um eine eingebaute Shell und nicht um einen Binärbefehl handelt.Antworten:
Der ausgeführte Befehl ist in der Desktop-Datei enthalten. Davor können Sie den folgenden Befehl
Exec=
extrahieren und ausführen:Um das aufzubrechen
Sie könnten dies in eine Datei einfügen, zum Beispiel
~/bin/deskopen
mit dem InhaltDann mach es ausführbar
Und dann könntest du z
Die Argumente (
%u
,%F
usw.) sind im Detail http://standards.freedesktop.org/desktop-entry-spec/desktop-entry-spec-1.0.html#exec-variables - keiner von ihnen relevant ist für in der Befehlszeile gestartet .quelle
grep '^Exec' firefox.desktop | sed 's/^Exec=//'
wird Firefox beispielsweise mit einem Tab geöffnet, auf dem www.% u.com geladen wird .sed
, um alle Argumente zu entfernen. Aber ich denke, es könnte eine "natürlichere" Art geben, es zu betreiben..desktop
Dateien, ignoriert jedoch Einträge wiePath=
undTryExec=
wirkt sich möglicherweise auf die Ausführung aus. Es wird auch das falsche ausgeführt,Exec=
wenn die Datei Desktop-Aktionen ("Schnelllisten") enthältDie Antwort sollte sein
Aber aufgrund eines Fehlers funktioniert dies nicht mehr.
quelle
exo-open
wird als Workaround aufgeführt und öffnet auch gedit. :(gnome-open
nicht nicht nennenxdg-open
, ist es umgekehrt! Das Problem liegt also ingvfs-open
(dem Nachfolger odergnome-open
)xdg-open
Werke von Mimetype Association, und.desktop
Dateien sind mit Texteditoren verknüpft, da sie eine Unterklasse von Text sindMit jedem aktuellen Ubuntu, das unterstützt,
gtk-launch
einfach losgtk-launch <file>
Wo ist der Name der .desktop-Datei mit oder ohne.desktop
Teil ?So
gtk-launch foo
öffnet sichfoo.desktop
(
gtk-launch
Dokumentation )Die .desktop sollte sich in / usr / share / applications, / usr / local / share / applications oder ~ / .local / share / applications befinden
Kann vom Terminal aus oder mit Alt + F2 verwendet werden (Alt + F2 speichert den Befehl in der Historie und ist so leicht zugänglich)
quelle
Ab heute (12.10) ist der Bug noch vorhanden. Es kommt in der Tat darauf an, wie
gvfs-open
(aufgerufen vonxdg-open
) funktioniert.Trotzdem schaffte ich eine schnelle Umgehung (Inspiration aus dem Nautilus-Quellcode stehlen). Es ist ein bisschen kompliziert, funktioniert aber unter Ubuntu 12.10 einwandfrei und fügt
?
dem Unity-Launcher ein aussagekräftiges Symbol (nicht mehr ) hinzu.Zuerst habe ich ein Python-Skript mit Gio geschrieben und es gespeichert als
~/bin/run-desktop
:Das Skript muss über die ausführbare Berechtigung verfügen, daher habe ich dies in einem Terminal ausgeführt:
Dann habe ich den relativen
.desktop
Eintrag erstellt am~/.local/share/applications/run-desktop.desktop
:Schließlich habe ich den Eintrag als Standard-Handler in
~/.local/share/applications/mimeapps.list
dem[Default Applications]
Abschnitt wie folgt zugeordnet :Jetzt:
xdg-open
something.desktop funktioniert wie erwartet#!/usr/bin/xdg-open
Hashbang über einem ausführbaren Desktop-Eintrag funktioniert auchEs wird nutzlose Arbeit sein, wenn
gvfs-open
der Fehler behoben wird, aber in der Zwischenzeit ...quelle
Exec=
Zeilen und%
Parameter im Befehl korrekt behandelt werden./usr/bin/xdg-openpy
und ihm einchmod +x
- gegeben undlauncher.launch([],context)
stattdessen verwendet...None,context)
(wegen " TypeError: Argument 1: Muss eine Sequenz sein, kein NoneType "). Funktioniert jetztxdg-openpy app.desktop
über die Befehlszeile (und alles wie gewohnt beim Doppelklickenapp.desktop
) und kann mich daran erinnern, wenn ich versuche, das Terminal anzurufenxdg-open
und die Tabulatortaste zu drücken. Prost!.desktop
Datei nicht manuell analysiert werden muss. Daher ist dies der vernünftigste (und sicherste) Ansatz. Verwendet auch moderngi.repository
statt veraltetpygtk
, also super! :)Der richtige Weg
Sie sollten wirklich verwenden,
gtk-launch
wenn es verfügbar ist. Es ist normalerweise Teil des Pakets libgtk-3-bin (dies kann je nach Distribution variieren).gtk-launch
wird wie folgt verwendet:Bitte beachten Sie, dass
gtk-launch
die .desktop- Datei installiert sein muss (dh sich in/usr/share/applications
oder befindet~/.local/share/applications
).Um dies zu umgehen, können wir eine kleine hackige Bash-Funktion verwenden, die die gewünschte .desktop- Datei vor dem Start vorübergehend installiert . Die "richtige" Art, eine .desktop- Datei zu installieren, ist über,
desktop-file-install
aber ich werde das ignorieren.Sie können es wie folgt verwenden (und auch zusätzliche Argumente oder URIs weitergeben, wenn Sie möchten):
Die manuelle Alternative
Wenn Sie eine .desktop- Datei manuell analysieren und ausführen möchten , können Sie dies mit dem folgenden
awk
Befehl tun :Wenn Sie den
awk
Befehl wie ein All-in-One-Skript behandeln möchten ; Wir können sogar eine Fehlermeldung anzeigen und mit dem Rückkehrcode 1 beenden, falls ein Exec- Befehl nicht gefunden wird:Die oben genannten Befehle werden:
%f
,%u
,%U
). Es ist möglich, diese durch Positionsargumente zu ersetzen, wie es die Spezifikation vorsieht, dies würde dem Problem jedoch eine erhebliche Komplexität hinzufügen. Siehe neueste Desktop-Eintragsspezifikation .Beachten Sie, dass dieses AWK-Skript einige Randfälle behandelt, die von einigen der anderen Antworten möglicherweise nicht richtig behandelt werden. Insbesondere entfernt dieser Befehl mehrere Exec- Variablen (wobei darauf geachtet wird, das% -Symbol nicht zu entfernen), führt nur einen einzigen Exec- Zeilenbefehl aus und verhält sich erwartungsgemäß, selbst wenn der Exec- Zeilenbefehl ein oder mehrere Gleichheitszeichen enthält (z
script.py --profile=name
. B. ).Nur ein paar andere Vorbehalte ... Laut Spezifikation ist TryExec :
In diesem Sinne macht es keinen Sinn, seinen Wert auszuführen.
Einige andere Probleme sind Path und Terminal . Path besteht aus dem Arbeitsverzeichnis, in dem das Programm ausgeführt werden soll. Terminal ist ein Boolescher Wert, der angibt, ob das Programm in einem Terminalfenster ausgeführt wird. Diese können alle angesprochen werden, aber es macht keinen Sinn, das Rad neu zu erfinden, da es bereits Implementierungen der Spezifikation gibt. Wenn Sie Path implementieren möchten, denken Sie daran, dass
system()
ein Unterprozess erzeugt wird, sodass Sie das Arbeitsverzeichnis nicht ändern können, indem Sie etwas tun wiesystem("cd \047" working_directory "\047"); system(command)
. Allerdings könnte man vermutlich sowas machensystem("cd \047" working_directory "\047 && " command)
. Hinweis \ 047 sind einfache Anführungszeichen (damit der Befehl bei Pfaden mit Leerzeichen nicht unterbrochen wird).Die Python-Alternative
Ich stehle eine Seite von Carlo hier , der einen Python - Skript anregte Verwendung des machen gi - Modul. Hier ist eine minimale Möglichkeit, denselben Code über die Shell auszuführen, ohne eine Datei erstellen und sich um die E / A kümmern zu müssen.
Führen Sie dann die Launcher-Funktion wie folgt aus:
Beachten Sie, dass die Verwendung von URIs optional ist. Außerdem wird keine Fehlerprüfung durchgeführt. Sie sollten daher sicherstellen, dass der Launcher vorhanden und lesbar ist (bevor Sie ihn verwenden), wenn Ihr Skript dauerhaft sein soll.
quelle
awk
Befehl ist nett. Daher ein +1awk
Lösung funktioniert nicht ordnungsgemäß, wenn der Befehl doppelte Leerzeichen oder umgekehrte Schrägstriche enthält. Es bricht darauf an:Exec=env WINEPREFIX="/path/to/.wine" wine c:\\\\windows\\\\command\\\\start.exe /Unix /path/to/.wine/dosdevices/c:/users/Public/Рабочий\\ стол/appname.lnk
Und diedex
Lösung funktioniert gut.Während OP nicht nach KDE fragte, kann für jeden, der KDE ausführt, der folgende Befehl verwendet werden:
kioclient exec <path-to-desktop-file>
Auf Fedora ist dies in der
kde-runtime
Drehzahl enthalten.quelle
Du könntest Dex benutzen .
quelle
.desktop
Dateien zu testen . Und es kann auch.desktop
Dateien erstellen , yay! :-)Scheint in Version 13.10 zu funktionieren, wenn Exo-Utils installiert sind (wie es bei Xubuntu der Fall ist).
quelle
Nachtrag zu Hamishs Antwort.
Wenn Sie das deskopen-Skript verwenden, können Sie einen Verweis darauf als shebang-Zeile in einer .desktop- Datei verwenden, da das Kommentarzeichen noch vorhanden ist
#
. Das heißt, setzen Sie dies als erste Zeile der .desktop- Datei:Dann kennzeichnen Sie die .desktop- Datei als ausführbar (z. B. mit einem
chmod +x whatever.desktop
) und dann können Sieund voilà - Die App wird geöffnet! (Vervollständigen Sie die angegebene Symboldatei, obwohl ich keine Ahnung habe, wie.)
Wenn Sie nun auch möchten, dass deskopen Befehlszeilenparameter durchläuft, können Sie stattdessen diese leicht geänderte Version verwenden:
Nebenbei habe ich versucht,
"#{@:2}"
anstelle vonshift
ing zu verwenden, aber es gab mir "schlechte Substitution" ...quelle
"${@:1}"
anstelle von verwendenshift
, aber das erfordertbash
anstelle vonsh
in Ihrem#!
shebang. IMHO Ihr ursprünglicher Schichtansatz ist einfacher und besserDerzeit gibt es keine Anwendung, die das tut, was Sie in den Ubuntu-Archiven beschrieben haben. Derzeit werden einige Anstrengungen unternommen, um eine allgemeine Lösung für die Integration von Desktop-Umgebungen (z. B. Openbox) zu entwickeln, die diesen XDG-Spezifikationen nicht entsprechen.
Arch Linux arbeitet an einer Implementierung von xdg-autostart basierend auf den Python-xdg-Bibliotheken. Soweit ich weiß, scheint dies noch nicht vollständig zu sein, doch es gibt einige Erfolgsberichte.
Es gibt auch eine C ++ - Implementierung von xdg-autostart auf gitorious (http://gitorious.org/xdg-autostart/), die wahrscheinlich von einer umfassenderen Verwendung profitieren würde.
Wenn eine der beiden Lösungen für Sie funktioniert, überlegen Sie bitte, ob Sie die erforderlichen Arbeiten für die Aufnahme in Debian oder Ubuntu einreichen möchten.
Um eines der beiden Tools mit openstart zu verwenden, rufen Sie es in /etc/xdg/openbox/autostart.sh auf (wenn ich die openbox-Dokumentation richtig lese). Wenn dies nicht funktioniert, können Sie es wahrscheinlich in einem der Openbox-Sitzungsinitialisierungsskripten aufrufen.
quelle
Ich habe keine sofortige Lösung, die die Anforderung für die Verwendung eines Standardbefehls erfüllt. Wenn Sie die
.desktop
Dateien jedoch nur minimal analysieren oder einen Bash-Alias erstellen möchten, sollte Folgendes funktionieren:awk -F= '/Exec=/{system($2); exit}' foo.desktop
Ein weiterer Ansatz, der interessant sein könnte, ist die Erstellung einer Kernel-Level-
binfmt-misc
Methode als Matching für.desktop
Dateien (siehegrep -r . /proc/sys/fs/binfmt_misc/
Muster, die Sie derzeit aktiviert haben).Letztendlich muss irgendwo etwas die
.desktop
Dateien analysieren , es ist nur eine Frage, wie "standard / default" das ist.quelle
awk
eher für als für eine Kette vongrep
s undsed
s.Exec=
Zeilen haben: /Ich habe das Skript aus der obigen Antwort von Carlo entnommen und versucht, es für meinen eigenen Desktop zu verbessern.
Mit dieser Version des Skripts können Sie jede App so ausführen, als ob Sie sie im HUD eingegeben hätten, sofern dies wahrscheinlich das erste Ergebnis ist. Sie können auch Dateiargumente für Desktopdateien übergeben, die keine URIs unterstützen.
quelle
Beim Versuch, diese Dateien zu testen, habe ich die einfachste Möglichkeit gefunden, um zu überprüfen, ob der DM oder der Sitzungsmanager das Umgebungsverzeichnis in einem Browser für Benutzeroberflächenordner öffnen und dann darauf doppelklicken, um sie zu öffnen.
Wenn Sie sich in einer Befehlszeile befinden:
gvfs-open .
odergnome-open .
diese im konfigurierten Ordner-Browser öffnen.Das Sed-Ding wird das Verhalten des DM nicht widerspiegeln, einschließlich fummeliger Dinge wie Fluchten und Zitieren, wo man wirklich kein alternatives Verhalten haben möchte. Es ist keine Befehlszeile, aber es hat die Dinge validiert. Ich fand die Einstellung auch
Terminal=true
nützlich für das Debuggen.quelle
Diese SO Antwort hat für mich deutlich gemacht: Versuchen Sie nicht, die Desktop-Datei auszuführen, sondern führen Sie die Datei aus, auf die in der Desktop-Datei verwiesen wird.
Führen Sie beispielsweise /home/jsmith/Desktop/x11vnc.sh aus
quelle
(Zusammengestellt aus den verschiedenen anderen Antworten hier)
Versuchen Sie je nach Ihrem System und den verschiedenen Fehlern, die auf Ihrem System vorhanden sein können oder nicht, Folgendes, bis einer von ihnen funktioniert:
xdg-open program_name.desktop
exo-open program_name.desktop
gtk-launch program_name.desktop
kioclient exec program_name.desktop
dex program_name.desktop
Beachten Sie, dass auf Ubuntu-Systemen Ihre "Startmenü" -Desktopstarter in verfügbar sind
/usr/share/applications/
.Als Beispiel, um zu zeigen, welche der obigen Befehle auf meinem Ubuntu 14.04-System funktionieren oder nicht, sind hier die Ergebnisse der folgenden Aufrufe für mich:
xdg-open /usr/share/applications/eclipse_for_cpp.desktop
# Fehler aufgrund eines Fehlers (versucht, mich diese .desktop-Datei speichern zu lassen)exo-open /usr/share/applications/eclipse_for_cpp.desktop
# Funktioniertgtk-launch /usr/share/applications/eclipse_for_cpp.desktop
# Schlägt fehl mit "gtk-launch: keine solche Anwendung"kioclient exec /usr/share/applications/eclipse_for_cpp.desktop
# Funktioniertdex /usr/share/applications/eclipse_for_cpp.desktop
# Schlägt fehl, &sudo apt install dex
kann das Paket dex nicht findenquelle
Stellen Sie sicher, dass das Skript, auf das Ihre Desktop-Datei zeigt, auch ausführbar ist.
Wenn immer noch nicht funktioniert. Machen Sie Desktop-Dateien durch Ändern im Terminal lauffähig
Terminal=true
und fügen Sie sie in ein Bash-Skript ein. Führen Sie das Skript aus, um die Fehlerausgabe abzufangen. Wechseln Sie zurück, wenn Fehler behoben sind.quelle
Die Antwort von Hamish ist großartig, aber ich würde gerne eine einfachere Alternative vorschlagen, bei der weniger Rohrleitungen erforderlich sind:
$(awk -F= '/^Exec/||/^TryExec/ {print $2;exit}' /usr/share/applications/firefox.desktop)
In diesem Fall wird
awk
nach der Zeile gesucht, die mit beginntExec
, und dann werden einfach Felder nach dieser Zeile gedruckt, wobei for loop verwendet wird, und=
Feld 2 wird gedruckt, dh was auch immer nach diesem Feld kommt. Die geschweiften Klammern an den Enden der Befehle$(...)
sind Parameterersetzungen, daher führt die Shell den jeweils zurückgegebenen awk-Befehl aus. In diesem Fall gibt es den tatsächlichen Befehl zurück, der danach kommtExec=
.In einigen seltenen Fällen kann es mehr als ein
=
Zeichen geben, was immer noch möglich ist. Dafür schlage ich vorquelle
awk
und Serg =)TryExec
, vielleicht sollten Sie Ihren 2. Befehl überprüfen =)awk
ist meine Waffe der Wahl, wenn es um Textverarbeitung geht. Außerdem ist seine Syntax in der Nähe vonC
. Oh, und bereitsTryExec
Teil hinzugefügt ^ _ ^%f
,%u
,%U
oder so etwas wie dies hinter dem Befehl?