web-dev-qa-db-fra.com

Exécuter plusieurs commandes xdotool sur une ligne séparées les unes des autres

J'essaie d'exécuter xdotool type Word puis xdotool key Return à partir des préférences d'applications de démarrage.
Mais si j'utilise && ou ;, xdotool l'évalue comme une continuation de l'entrée.

9
janot

Longue histoire courte:
Utilisez un script.

#! /bin/sh
# With some window selection magic, or a sleep 
# if you want to do that manually.
xdotool type Word
xdotool key Return

Et mettez le chemin du script dans le champ Execname__.


Longue histoire:

Selon la xdotoolmanpage :

type
       Supports newlines and tabs (ASCII newline and tab). 
       With respect to "COMMAND CHAINING", this command consumes the
       remainder of the arguments and types them. That is, no commands can
       chain after 'type'.

Le chaînage de commandes via ; ou & n'est pas possible, car il s'agit de la syntaxe Shell et les applications de démarrage ne prennent pas en charge la syntaxe Shell. Cependant, si vous souhaitez simplement appuyer sur Enter après avoir tapé quelque chose, il existe un moyen détourné de le faire.

Quand il dit "nouvelle ligne" ASCII, cela ne signifie pas un \n nu. Et la substitution de commande (xdotool type "$(printf '\n')", par exemple) mange les retours à la ligne. Après ceci xdotoolsforum post , j'ai essayé ceci:

xdotool type "$(printf 'date\n ')"

Et ça a fonctionné. Mais cela ne fonctionne que s’il ya un caractère après le \n, ce qui laisse évidemment un espace de fin, qui ne serait pas ce que vous voulez. J'ai modifié cela pour:

xdotool type "$(printf 'date\n\e ')"

Et cela fonctionne et ne laisse aucun espace de fuite. Cependant, cela pourrait poser des problèmes à ceux qui utilisent le mode Vi dans leur shell.

Merci à commentaires de @ steeldriver J'ai compris que cela était dû à mon essai sur le terminal sur lequel j'exécutais les commandes. Juste un petit écart entre mon pressage Enter et la commande xdotoolétait suffisante pour qu'une seule nouvelle ligne soit correctement enregistrée. Ainsi:

sleep 0.1; xdotool type $'date\n'

Donc soit prolonger la ligne en la citant:

xdotool type 'date
'

ou utiliser l'interprétation de Shell comme suggéré par @steeldriver, semble être la bonne option.

Cependant, un script contenant:

#! /bin/sh
sleep 1
xdotool type date
xdotool key Return

dans le champ Execa bien fonctionné. En effet, je recommande toujours d'utiliser un script pour les commandes complexes dans un fichier de bureau.

Vous pouvez avoir un script avec /usr/bin/xdotool dans Shebang, mais la page de manuel indique que "le mode scriptn'est pas complètement étoffé et peut tomber en deçà de vos attentes", alors je me suis tenu à des scripts bash.

Je voyais peut-être des choses, mais lors de mes premiers essais, je devais mettre un (petit) sleepentre les commandes typeet keyname__. C'était un artefact de l'essayer sur le terminal qui exécutait les commandes au lieu d'une autre fenêtre.

14
muru

Il me semble que l'application n'analyse pas plusieurs commandes, mais la traite comme une seule commande. En tant que tel, faites-en une seule commande en l'enveloppant d'un appel Shell ...

bash -c 'xdotool type date; xdotool key Return'

Maintenant, vous pouvez aussi faire d'autres choses Shell ...

bash -c 'xdotool type "`date +"%Y-%m-%d_%T`"'

Notez que la commande "date" utilisée dans cette dernière inclut une nouvelle ligne! et "xdotool" le sortira.

NOTE: si vous faites ceci en tant que macro clavier, j'ajouterais quelques options supplémentaires à "xdotool" pour que cela fonctionne mieux ...

bash -c 'xdotool type --clearmodifiers -delay 0 "`date +"%Y-%m-%d_%T`"'
1
anthony