201 votes

Exécution d'un fichier desktop dans le terminal

D'après ce que j'ai pu comprendre, les fichiers .desktop sont des raccourcis qui permettent de personnaliser les paramètres de l'application. Par exemple, j'en ai beaucoup dans mon dossier /usr/share/applications/.

Si j'ouvre ce dossier dans nautilus, je peux exécuter ces applications en double-cliquant simplement sur leur fichier associé, par exemple, double-cliquer sur firefox.desktop lance Firefox. Cependant, je ne trouve pas de moyen de faire la même chose via le terminal.

Si je fais gnome-open foo.desktop, cela ouvre simplement foo.desktop comme un fichier texte. Si je le rends exécutable puis le lance dans bash, cela échoue simplement (ce qui est attendu, ce n'est clairement pas un script bash).
EDIT : Faire exec /chemincomplet/foo.desktop me donne un message Permission denied, même si je change la propriété à moi-même. Si je le rends exécutable et que je fais la même commande, l'onglet terminal que j'utilise se ferme simplement (je suppose que cela plante). Enfin, si je fais sudo exec /chemincomplet/foo.desktop, j'obtiens une erreur signalant sudo : exec : command not found.

Voilà ma question, comment puis-je exécuter un fichier foo.desktop à partir du terminal?

121voto

doug Points 16490

gtk-launch

Avec n'importe quelle version récente d'Ubuntu prenant en charge gtk-launch, il suffit simplement d'aller

gtk-launch 

Où est le nom du fichier .desktop avec ou sans la partie .desktop. Le nom ne doit pas inclure le chemin complet.

Le fichier .desktop doit être dans /usr/share/applications, /usr/local/share/applications ou ~/.local/share/applications.

Ainsi, gtk-launch foo ouvre /usr/share/applications/foo.desktop (ou foo.desktop situé dans l'un des autres répertoires autorisés.)

D'après la documentation de gtk-launch :

gtk-launch lance une application en utilisant le nom donné. L'application est démarrée avec une notification de démarrage appropriée sur un affichage par défaut, sauf indication contraire.

gtk-launch prend au moins un argument, le nom de l'application à lancer. Le nom doit correspondre au nom du fichier desktop de l'application, tel qu'il réside dans /usr/share/application, avec ou sans le suffixe '.desktop'.

Utilisable depuis le terminal ou Alt + F2 (Alt + F2 stocke la commande dans l'historique pour y accéder facilement).

101voto

Brett Veenstra Points 1447

La réponse devrait être

xdg-open nom_du_programme.desktop

Mais en raison d'un bogue (ici en amont), cela ne fonctionne plus.

81voto

ESV Points 4591

Réponse moderne

gtk-launch - où est le nom du fichier du fichier .desktop, avec ou sans l'extension .desktop.

Consultez une autre réponse sur ce fil de discussion pour plus de détails. J'ai obtenu ces informations de cette réponse.

Réponse d'outils shell obsolètes

Écrit il y a longtemps - consultez les commentaires sous cette réponse pour voir pourquoi cette approche ne fonctionnera pas pour de nombreux fichiers de bureau.

La commande qui est exécutée est contenue à l'intérieur du fichier de bureau, précédée de Exec= vous pourriez extraire et exécuter cela en:

$(grep '^Exec' filename.desktop | tail -1 | sed 's/^Exec=//' | sed 's/%.//' \
| sed 's/^"//g' | sed 's/" *$//g') &

Pour expliquer cela

grep  '^Exec' filename.desktop    # - trouve la ligne qui commence par Exec
| tail -1                         # - utilise uniquement la dernière ligne, au cas où il y en aurait plusieurs 
| sed 's/^Exec=//'                # - supprime Exec du début de la ligne
| sed 's/%.//'                    # - supprime les arguments - %u, %f etc
| sed 's/^"//g' | sed 's/" *$//g' # - supprime les " autour de la commande (si présent)
$(...)                            # - signifie exécuter le résultat de la commande exécutée ici
&                                 # - à la fin signifie l'exécuter en arrière-plan

Vous pourriez mettre cela dans un fichier, disons ~/bin/deskopen avec le contenu

#!/bin/sh
$(grep '^Exec' $1 | tail -1 | sed 's/^Exec=//' | sed 's/%.//' \
| sed 's/^"//g' | sed 's/" *$//g') &

Ensuite, rendez-le exécutable

chmod +x ~/bin/deskopen

Et puis vous pourriez faire, par exemple

deskopen /usr/share/applications/ubuntu-about.desktop

Les arguments (%u, %F etc) sont détaillés ici. Aucun d'entre eux n'est pertinent pour le lancement en ligne de commande.

40voto

Raman Points 509

Alors que l'OP ne posait pas de questions sur KDE, pour toute personne utilisant KDE, la commande suivante peut être utilisée :

kioclient exec

Sous Fedora, cela est inclus dans le rpm kde-runtime.

39voto

Carlo Pellegrini Points 498

Le bug est toujours présent depuis 2006. En fait, cela dépend de comment gvfs-open (appelé par xdg-open) fonctionne.

Néanmoins, j'ai réussi à contourner rapidement le problème (en m'inspirant du code source de nautilus). C'est un peu compliqué, mais cela fonctionne parfaitement sur Ubuntu 12.10, en ajoutant une icône significative (plus de ?) sur le lanceur Unity.

Tout d'abord, j'ai écrit un script en python utilisant Gio et je l'ai enregistré sous le nom de ~/bin/run-desktop :

#!/usr/bin/python

from gi.repository import Gio
import sys 

def main(myname, desktop, *uris):
    launcher = Gio.DesktopAppInfo.new_from_filename(desktop)
    launcher.launch_uris(uris, None)

if __name__ == "__main__":
    main(*sys.argv)

Le script doit avoir l'autorisation d'exécution, donc j'ai exécuté ceci dans un terminal :

chmod +x ~/bin/run-desktop

Ensuite, j'ai créé l'entrée .desktop relative à ~/.local/share/applications/run-desktop.desktop :

[Desktop Entry]
Version=1.0
Name=run-desktop
Exec=run-desktop %U
MimeType=application/x-desktop
Terminal=false
Type=Application

Enfin, j'ai associé l'entrée comme gestionnaire par défaut dans ~/.local/share/applications/mimeapps.list sous la section [Default Applications] comme suit :

[Default Applications]
....
application/x-desktop=run-desktop.desktop

Maintenant :

  • xdg-open something.desktop fonctionne comme prévu
  • #!/usr/bin/xdg-open le hashbang au sommet d'une entrée de bureau exécutable fonctionne également

Ce sera un travail inutile lorsque gvfs-open résoudra le bug, mais en attendant...

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X