Horodatage dans Exec = ligne de fichier .desktop possible?

11

Lubuntu 16.04 - Session Openbox

Je peux utiliser le terminal pour ouvrir un fichier horodaté avec gedit:

gedit ~/$(date +%Y%m%d%H%M%S).txt

La commande peut également être utilisée via un raccourci clavier dans Openbox.

<keybind key="W-4">        # gedit time-stamped file
  <action name="Execute"><command>sh -c 'gedit ~/$(date +%Y%m%d%H%M%S).txt'</command></action>
</keybind>

Mais je ne peux pas faire de même via la Exec=ligne d'un .desktopfichier.

Exec=sh -c 'gedit ~/$(date +%Y%m%d%H%M%S).txt'

crée simplement un fichier appelé ~/.txt

Alors, comment puis-je obtenir un fichier .desktop pour faire ce que je veux?

DK Bose
la source
1
Je ne pense pas que le fichier .desktop puisse appeler des $()commandes de sous-shell comme ça. Je pense que vous en avez besoin pour appeler un autre script qui contient votre commande de sous-shell pour ouvrir votre fichier.
Terrance
Bien sûr, je vais le faire. =)
Terrance
1
Les fichiers HI @DKBose .desktop peuvent exécuter des sous-shells, car ils Exec=/bin/bash -c "echo $(date) > ~/out.txt"fonctionnent correctement . le +%Y%m%d%H%M%Ssemble être le problème. encore à mâcher.
Jacob Vlijm
Je suppose que la première chose ne fonctionne pas parce que% est déjà utilisé comme arguments de ligne de commande pour l'exec dans les fichiers .desktop Il pourrait être possible de les échapper d'une manière ou d'une autre, mais l'autre solution semble correcte. J'aurais ajouté ceci en tant que commentaire, mais mon compte ici est nouveau.
Mikael Kjær
1
Salut @DKBose voir ma réponse :)
Jacob Vlijm

Réponses:

10

Malheureusement, les fichiers .desktop n'appellent pas toujours les commandes de sous-shell $()comme nous le souhaiterions. Une façon de faire cela que j'ai trouvé serait de créer un autre script qui contient la commande sous-shell pour ouvrir le fichier comme ça.

La Execligne ressemblerait à:

Exec=/path/to/script

alors votre fichier de script contiendrait la commande pour ouvrir votre nouveau fichier:

#!/bin/sh

gedit ~/$(date +%Y%m%d%H%M%S).txt

le script devrait également être exécutable:

chmod +x /path/to/script

J'espère que cela t'aides!

Terrance
la source
@JacobVlijm Le problème est-il similaire à ce que l'on voit cronlà où certains caractères ( %?) Doivent être esacpés?
DK Bose
@DKBose Peut-être très bien, je suis toujours en train de jouer avec, et je pense que cela devrait fonctionner. Les sous-coquilles seules ne sont pas un problème.
Jacob Vlijm
@JacobVlijm Vous avez probablement raison. J'ai trouvé que j'aime éviter les commandes de sous-shell dans des fichiers comme ceux-ci, tout comme dans le sources.listfichier d'apt vous ne pouvez pas remplacer le nom de la version $(lsb_release -sc)car cela ne fonctionne pas non plus. Si vous le comprenez, j'aimerais voir comment vous l'avez fait. :)
Terrance
Salut Terrance, ça marche! Voir ma réponse ...
Jacob Vlijm
@JacobVlijm essayez d'utiliser +\%Y\%m\%d\%H\%M\%Salors cela devrait fonctionner.
Videonauth
8

Le problème

Un script n'est pas nécessaire.

Le problème n'est pas qu'un .desktopfichier ne peut pas exécuter de commandes avec des sous-coquilles, car

Exec=/bin/bash -c "echo $(date) > ~/out.txt"

fonctionne parfaitement bien dans un .desktopfichier.

En tripotant la commande, je suis arrivé à la conclusion que le %caractère-est à l'origine du problème. Je n'ai cependant aucune explication à cela, et jusqu'à présent je n'ai pas pu trouver d'informations sur la façon de résoudre ou d'échapper à cela.

Je suis donc allé chercher une commande pour obtenir l'heure sans utiliser le personnage suspect.

Vous pouvez également utiliser Ruby pour la date et l'heure

Cela m'amène à Ruby, qui produit la date et l'heure actuelles à partir de la commande:

$ ruby -e 'puts Time.now.inspect'
2016-05-29 16:12:36 +0200

Lorsque nous modifions un peu la sortie avec awk, en supprimant les espaces et les délimiteurs, nous avons exactement ce que nous voulons, et une commande de travail dans le .desktopfichier, car nous n'utilisons pas %:

Exec=/bin/bash -c  "gedit ~/$(ruby -e 'puts Time.now.inspect' | awk -F'[: -]' '{print $1$2$3$4$5$6}')"


entrez la description de l'image ici

Remarque!

Sans doute, la commande peut être un peu "charmée", je vais probablement éditer un peu la réponse aujourd'hui ou demain.

Jacob Vlijm
la source
Agréable! C'est définitivement une autre façon de procéder. Je n'ai pas installé Ruby mais une fois installé, cela fonctionne définitivement. Je conviens qu'en jouant avec cela, vous pourriez le faire ressembler à ce que vous voulez. :)
Terrance
@Terrance, il s'avère que c'est une question intéressante. Jamais rencontré de problème dans des .desktopfichiers comme celui-ci auparavant ...
Jacob Vlijm
Moi non plus. C'est bon à savoir, et j'ai constaté qu'en répondant à des questions comme celles-ci beaucoup de fois, nous apprenons aussi beaucoup nous-mêmes. :)
Terrance
1
@Terrance 99% de ce que je sais que j'ai appris en répondant aux questions :)
Jacob Vlijm
1
Vous m'avez aussi inspiré à changer ma formulation dans ma réponse. J'ai changé le mien pour être à sens unique au lieu de la meilleure. Et d'autres changements de ce genre pour que les gens ne pensent pas que c'est la seule façon. Je vous remercie! :)
Terrance