D'après ce que je peux .desktop
comprendre , les fichiers sont des raccourcis permettant de personnaliser les paramètres de l'application. Par exemple, j'en ai beaucoup dans mon /usr/share/applications/
dossier.
Si j'ouvre ce dossier nautilus
, je peux exécuter ces applications en double-cliquant sur le fichier qui lui est associé, par exemple en double-cliquant firefox.desktop
sur Firefox. Cependant, je ne trouve pas le moyen de faire la même chose via un terminal.
Si je le fais gnome-open foo.desktop
ouvre simplement foo.desktop
comme un fichier texte. Si je le rend exécutable puis que je l'exécute en bash, il échoue simplement (ce qui est prévu, ce n'est clairement pas le script bash).
EDIT: Faire exec /fullpath/foo.desktop
me donne un Permission denied
message, même si je change de propriétaire pour moi-même. Si je m’exécute et que je fais la même commande, l’onglet du terminal que j’utilise est tout simplement fermé (je suppose qu’il se bloque). Enfin, si je le fais sudo exec /fullpath/foo.desktop
, je reçois un rapport d'erreur sudo: exec: command not found
.
Voilà ma question, comment puis-je exécuter un foo.desktop
fichier à partir du terminal?
la source
exec
échec est parce qu'exec remplace votre processus en cours d'exécution par le processus que vous spécifiez. Vous avez donc essayé de remplacer votre shell par l'exécution du poste de travail sous forme de fichier binaire compilé. La raison pour laquelle vous ne pouviez pas le fairesudo exec
est qu'il s'agit d'un shell intégré et non d'une commande binaire.Réponses:
La commande qui est exécutée est contenue dans le fichier du bureau, précédée de
Exec=
afin que vous puissiez l'extraire et l'exécuter comme suit:Pour décomposer cela
Vous pouvez mettre cela dans un fichier, par exemple
~/bin/deskopen
avec le contenuPuis le rendre exécutable
Et alors vous pourriez faire, par exemple
Les arguments (
%u
,%F
etc.) sont détaillés sur http://standards.freedesktop.org/desktop-entry-spec/desktop-entry-spec-1.0.html#exec-variables - aucun d’entre eux n’est pertinent pour un lancement en ligne de commande. .la source
grep '^Exec' firefox.desktop | sed 's/^Exec=//'
ouvre Firefox avec un onglet qui charge www.% U.com .sed
pour supprimer tous les arguments. Mais je pense qu’il pourrait y avoir une façon plus "naturelle" de le gérer..desktop
fichiers simples , mais il ignore les entrées telles quePath=
etTryExec=
qui peuvent affecter l'exécution. Il s’exécute également de manière erronéeExec=
si le fichier contient des actions du bureau ("quicklists")La réponse devrait être
Mais à cause d' un bug, cela ne fonctionne plus.
la source
exo-open
est répertorié comme solution de contournement et ouvre gedit aussi. :(gnome-open
ne pas appelerxdg-open
, il est l'inverse! Donc, le problème réside dansgvfs-open
(le successeur ougnome-open
)xdg-open
fonctionne par association de types MIME, et les.desktop
fichiers sont associés aux éditeurs de texte, car ils sont une sous-classe de texteAvec tout ubuntu récent qui prend en charge
gtk-launch
tout simplement allergtk-launch <file>
où est le nom du fichier .desktop avec ou sans la.desktop
partieDonc
gtk-launch foo
ouvrefoo.desktop
(
gtk-launch
documentation )Le fichier .desktop doit se trouver dans / usr / share / applications, / usr / local / share / applications ou ~ / .local / share / applications
Utilisable depuis le terminal ou alt + F2 (alt + F2 enregistre la commande dans l'historique si facilement accessible)
la source
A partir d'aujourd'hui (12h10), le bogue est toujours présent. Cela dépend en fait de la façon dont
gvfs-open
(appelé parxdg-open
) fonctionne.Malgré tout, j'ai réussi à contourner rapidement ce problème (en m'inspirant du code source de Nautilus). C'est un peu compliqué, mais fonctionne parfaitement sur Ubuntu 12.10, en ajoutant une icône significative (sans plus
?
) sur le lanceur Unity.Tout d'abord, j'ai écrit un script python à l'aide de Gio et l'ai placé sous le nom
~/bin/run-desktop
:Le script doit avoir l'autorisation de l'exécutable, j'ai donc lancé ceci dans un terminal:
Ensuite, j'ai créé l'
.desktop
entrée relative sur~/.local/share/applications/run-desktop.desktop
:Enfin, j’ai associé l’entrée en tant que gestionnaire par défaut
~/.local/share/applications/mimeapps.list
sous la[Default Applications]
section:Maintenant:
xdg-open
quelque chose.desktop fonctionne comme prévu#!/usr/bin/xdg-open
hashbang au-dessus d'une entrée de bureau exécutable fonctionne aussiCe sera un travail inutile quand
gvfs-open
le bug sera résolu, mais en attendant ...la source
Exec=
lignes et%
paramètres dans la commande./usr/bin/xdg-openpy
, et lui ai donné unchmod +x
- et utilisé à lalauncher.launch([],context)
place de...None,context)
(à cause de " TypeError: argument 1: Doit être une séquence, pas NoneType "). Maintenantxdg-openpy app.desktop
fonctionne en ligne de commande (et tout comme d'habitude lorsque vous double-cliquezapp.desktop
), et il peut me rappeler si j'essaie d'appeler dans le terminalxdg-open
et d'appuyer sur la touche de tabulation. À votre santé!.desktop
fichier, c'est donc l'approche la plus saine (et sûre). Utilise également modernegi.repository
au lieu de obsolètepygtk
, donc super! :)Le droit chemin
Vous devriez vraiment utiliser
gtk-launch
s'il est disponible. Cela fait généralement partie du paquet libgtk-3-bin (cela peut varier en fonction de la distribution).gtk-launch
est utilisé comme suit:Veuillez noter que
gtk-launch
le fichier .desktop doit être installé (c'est-à-dire situé dans/usr/share/applications
ou~/.local/share/applications
).Donc, pour contourner ce problème, nous pouvons utiliser une petite fonction haletante de Bash qui installe temporairement le fichier .desktop souhaité avant de le lancer. La méthode "correcte" pour installer un fichier .desktop est via,
desktop-file-install
mais je vais l'ignorer.Vous pouvez l'utiliser comme ça (et également transmettre des arguments supplémentaires ou des URI si vous le souhaitez):
L'alternative manuelle
Si vous souhaitez analyser et exécuter manuellement un fichier .desktop , vous pouvez le faire avec la
awk
commande suivante :Si vous souhaitez traiter la
awk
commande comme un script tout-en-un; nous pouvons même afficher un message d'erreur et quitter avec un code de retour de 1 dans le cas où une commande Exec est introuvable:Les commandes susmentionnées vont:
%f
,%u
,%U
). Il est possible de remplacer ceux-ci par des arguments de position comme le prévoit la spécification, mais cela compliquerait considérablement le problème. Voir la dernière spécification du poste de travail .Notez que ce script AWK aborde quelques cas marginaux qui peuvent ou ne peuvent pas être traités correctement par certaines des autres réponses. Plus précisément, cette commande supprime plusieurs variables Exec (en prenant soin de ne pas supprimer le symbole%), n'exécutera qu'une seule commande de ligne Exec et se comportera comme prévu même si la commande de ligne Exec contient un ou plusieurs signes égal (par exemple
script.py --profile=name
).Juste quelques autres avertissements ... Selon la spécification, TryExec est:
Dans cet esprit, il n’a aucun sens d’exécuter sa valeur.
Path et Terminal sont quelques autres problèmes . Path est constitué du répertoire de travail dans lequel exécuter le programme. Terminal est un booléen indiquant si le programme est exécuté dans une fenêtre de terminal. Tous ces problèmes peuvent être résolus, mais il est inutile de réinventer la roue car il existe déjà des implémentations de la spécification. Si vous souhaitez implémenter Path , gardez à l'esprit que
system()
génère un sous-processus, vous ne pouvez donc pas modifier le répertoire de travail en procédant de la manière suivantesystem("cd \047" working_directory "\047"); system(command)
. Cependant, vous pourriez probablement faire quelque chose commesystem("cd \047" working_directory "\047 && " command)
. Note \ 047 sont des guillemets simples (pour que la commande ne soit pas interrompue sur les chemins contenant des espaces).L'alternative Python
Je vole une page de Carlo ici , qui a suggéré de créer un script Python pour utiliser le module gi . Voici un moyen minimal d'exécuter le même code à partir du shell sans avoir à créer un fichier et à vous soucier des E / S.
Puis exécutez la fonction lanceur comme suit:
Notez que l'utilisation des URI est facultative. En outre, aucune vérification d'erreur n'est effectuée. Vous devez donc vous assurer que le programme de lancement existe et qu'il est lisible (avant de l'utiliser) si vous souhaitez que votre script soit durable.
la source
awk
commande est sympa. Par conséquent, un +1awk
solution ne fonctionnera pas correctement si la commande comporte des espaces blancs ou des barres obliques inverses à double échappement. Cela tombe en panne:Exec=env WINEPREFIX="/path/to/.wine" wine c:\\\\windows\\\\command\\\\start.exe /Unix /path/to/.wine/dosdevices/c:/users/Public/Рабочий\\ стол/appname.lnk
et ladex
solution fonctionne bien.Alors que OP ne demandait pas à propos de KDE, pour toute personne utilisant KDE, la commande suivante peut être utilisée:
kioclient exec <path-to-desktop-file>
Sur Fedora, cela est inclus dans le
kde-runtime
régime.la source
Vous pouvez utiliser dex .
la source
.desktop
fichiers manuscrits . Et il peut créer des.desktop
fichiers aussi, yay! :-)semble fonctionner dans la version 13.10, si exo-utils est installé (comme c'est le cas avec Xubuntu).
la source
Addendum à la réponse de Hamish.
Etant donné le script deskopen, vous pouvez utiliser une référence à celle-ci en tant que ligne shebang dans un fichier .desktop , car le caractère de commentaire est toujours
#
. C'est-à-dire, mettez ceci comme première ligne du fichier .desktop :Ensuite, marquez le fichier .desktop en tant que fichier exécutable (par exemple avec a
chmod +x whatever.desktop
), puis vous pourrezet voilà - L'application va s'ouvrir! (Complétez le fichier d'icône que j'ai spécifié, bien que je ne sache pas comment.)
Maintenant, si vous souhaitez également que deskopen transmette des paramètres de ligne de commande, vous pouvez utiliser cette version légèrement modifiée:
En passant, j'ai essayé d'utiliser
"#{@:2}"
au lieu d'shift
ing, mais cela continuait à me donner une "mauvaise substitution" ...la source
"${@:1}"
au lieu deshift
, mais cela nécessitebash
au lieu desh
dans votre#!
shebang. IMHO votre approche d'équipe originale est plus simple et meilleureIl n'y a actuellement aucune application qui fasse ce que vous décrivez dans les archives Ubuntu. Quelques efforts sont en cours pour créer une solution générale offrant une intégration pour les environnements de bureau (tels que openbox) qui ne sont pas conformes à ces spécifications XDG.
Arch Linux travaille sur une implémentation de xdg-autostart basée sur les bibliothèques python-xdg. D'après ce que je peux trouver, cela ne semble pas encore tout à fait complet, mais il existe des rapports de succès.
Il existe également une implémentation C ++ de xdg-autostart sur gitorious (http://gitorious.org/fr/xdg-autostart/) qui bénéficierait probablement d'une utilisation plus large.
Si l'une de ces solutions vous convient, envisagez de soumettre le travail nécessaire à l'inclusion dans Debian ou Ubuntu.
Pour utiliser l'un des deux outils avec openstart, vous devez l'appeler dans /etc/xdg/openbox/autostart.sh (si je lis correctement la documentation openbox). Si cela ne fonctionne pas, vous pouvez probablement l'appeler dans n'importe lequel des scripts d'initialisation de session openbox.
la source
Je n'ai pas de solution immédiate répondant à la condition "d'utiliser une commande standard" , mais si vous souhaitez analyser les
.desktop
fichiers de manière minimale ou si vous souhaitez créer un alias Bash, les éléments suivants devraient fonctionner:awk -F= '/Exec=/{system($2); exit}' foo.desktop
Une autre approche qui pourrait être intéressante serait de créer une
binfmt-misc
méthode au niveau du noyau qui ne correspond pas aux.desktop
fichiers (voirgrep -r . /proc/sys/fs/binfmt_misc/
pour les modèles que vous avez activés).À la fin de la journée, quelque chose quelque part devra analyser les
.desktop
fichiers, c'est juste une question de comment "standard / default" c'est.la source
awk
plutôt que d'une chaîne degrep
s etsed
s.Exec=
lignes: /J'ai repris le script de la réponse de Carlo ci-dessus et j'ai tenté de l'améliorer pour mon propre usage sur le bureau.
Cette version du script vous permettra d'exécuter n'importe quelle application comme si vous l'aviez entrée sur le HUD, à condition que ce soit probablement le premier résultat. Il vous permet également de passer des arguments de fichier pour les fichiers .desktop qui ne prennent pas en charge les URI.
la source
En essayant de tester ces fichiers, j’ai trouvé le moyen le plus simple de vérifier que le gestionnaire de session ou le gestionnaire de sessions ferait ce que j’attendais: ouvrir le répertoire environnant dans un navigateur de dossiers d’UI, puis double-cliquer pour les ouvrir.
Si vous êtes en ligne de commande:
gvfs-open .
ougnome-open .
l'ouvrirez dans le navigateur de dossiers configuré.Le système sed ne reflétera pas le comportement du sous-ministre, y compris des choses délicates telles que des évasions et citant les endroits où vous ne voudriez pas d'un comportement alternatif. Ce n'est pas une ligne de commande, mais cela a validé les choses. J'ai également trouvé le réglage
Terminal=true
utile pour le débogage.la source
Cette réponse SO est ce qui m’a permis de comprendre: n’essayez pas d’exécuter le fichier de bureau, mais exécutez le fichier indiqué dans le fichier de bureau.
Par exemple, exécutez /home/jsmith/Desktop/x11vnc.sh
la source
(Compilé à partir des différentes autres réponses ici)
En fonction de votre système et des divers bogues qui peuvent ou non exister sur votre système, essayez les étapes suivantes jusqu'à ce que l'un d'entre eux fonctionne:
xdg-open program_name.desktop
exo-open program_name.desktop
gtk-launch program_name.desktop
kioclient exec program_name.desktop
dex program_name.desktop
Notez que sur les systèmes Ubuntu, vos lanceurs de bureau "Menu Démarrer" sont disponibles dans
/usr/share/applications/
.A titre d'exemple, pour montrer quelles commandes ci-dessus fonctionnent ou non sur mon système Ubuntu 14.04, voici les résultats des appels suivants pour moi:
xdg-open /usr/share/applications/eclipse_for_cpp.desktop
# Échoue à cause d'un bogue (essaie de me faire sauvegarder ce fichier .desktop)exo-open /usr/share/applications/eclipse_for_cpp.desktop
# Travauxgtk-launch /usr/share/applications/eclipse_for_cpp.desktop
# Échoue avec "gtk-launch: aucune application de ce type"kioclient exec /usr/share/applications/eclipse_for_cpp.desktop
# Travauxdex /usr/share/applications/eclipse_for_cpp.desktop
# Échec, etsudo apt install dex
impossible de localiser le paquet dexla source
Assurez-vous que le script sur lequel pointe votre fichier de bureau est également exécutable.
Si ça ne marche toujours pas. Rendre le fichier de bureau exécutable dans le terminal en le changeant
Terminal=true
et le placer dans un script bash. Exécutez le script pour intercepter la sortie d'erreur. Revenir en arrière lorsque les erreurs sont corrigées.la source
La réponse de Hamish est excellente, mais j'aimerais suggérer une alternative plus simple, avec moins de tuyauterie:
$(awk -F= '/^Exec/||/^TryExec/ {print $2;exit}' /usr/share/applications/firefox.desktop)
Dans ce cas,
awk
recherche une ligne commençant parExec
, puis nous imprimons simplement les champs après cette ligne, en utilisant for et=
nous imprimons le champ 2, c’est-à-dire tout ce qui vient après ce champ. Les accolades aux extrémités des commandes,$(...)
sont des substitutions de paramètres, ainsi le shell exécutera toutes les commandes awk retournées; dans ce cas, il retourne la commande réelle qui vient aprèsExec=
.Dans de rares cas, il peut y avoir plus d’un
=
signe, ce qui reste une possibilité. Pour cela, je suggèrela source
awk
et Serg =)TryExec
, peut-être devriez-vous vérifier votre 2e commande =)awk
est mon arme de choix pour le traitement de texte. De plus, sa syntaxe est proche deC
. Oh, et déjà ajouté uneTryExec
partie ^ _ ^%f
,%u
,%U
ou quelque chose comme ça derrière la commande?