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

11

J'essaie de courir xdotool type wordensuite à xdotool key Returnpartir des préférences des applications de démarrage.
Mais si j'utilise &&ou ;, xdotool l'évalue comme la continuation de l'entrée.

janot
la source
1
Dans mon cas d'utilisation, il fonctionne avec xdotool type $'word\r', où le $''échappe \rà quelque chose comme return ( \nne fonctionne pas ici).
Scz

Réponses:

16

Longue histoire:
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 sur le Execterrain.


Longue histoire:

Selon la xdotoolpage de manuel :

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 du shell et les applications de démarrage ne prennent pas en charge la syntaxe du shell. Cependant, si tout ce que vous souhaitez faire est d'appuyer sur Enteraprès avoir tapé quelque chose, il existe un moyen détourné de le faire.

Quand il est écrit "newline" ASCII ", cela ne signifie pas une mise à nu \n. Et la substitution de commande ( xdotool type "$(printf '\n')"disons) mange des sauts de ligne de fin. Suite à ce xdotoolspost sur le forum , j'ai essayé ceci:

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

Et ça a marché. Mais cela ne fonctionne que s'il y a du caractère après le \n, et cela laisse évidemment un espace de fin, ce 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 causer des problèmes à ceux qui utilisent le mode Vi dans leur shell.

Grâce aux commentaires de @ steeldriver, j'ai compris que c'était dû à mon essai sur le terminal même sur lequel j'exécutais les commandes. Juste un petit écart entre ma pression Enteret la xdotoolcommande était suffisant pour qu'une seule nouvelle ligne soit enregistrée correctement. Donc:

sleep 0.1; xdotool type $'date\n'

Donc, soit en prolongeant la ligne en la citant:

xdotool type 'date
'

ou en utilisant l'interprétation du shell comme suggéré par @steeldriver ressemble à la bonne option.

Cependant, un script contenant:

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

sur le Execterrain a bien fonctionné. En effet, je recommande toujours d'utiliser un script pour des commandes complexes dans un fichier de bureau.

Vous pouvez avoir un script /usr/bin/xdotooldans le shebang, mais la page de manuel indique que "le scriptmode n'est pas complètement étoffé et peut tomber en dessous de vos attentes", donc je me suis contenté de bash les scripts.

J'aurais peut-être vu des choses, mais dans mes premiers essais, j'ai dû mettre un (petit) sleepentre les commandes typeetkey . C'était un artefact de l'essayer sur le terminal qui exécutait les commandes au lieu d'une autre fenêtre.

muru
la source
Un saut de ligne littéral semble fonctionner, c'est-à-dire xdotool type 'wordsuivi de la touche 'Entrée' puis de la fermeture ', comme le fait $'word\n'(dans lequel bash étend le \nà un saut de ligne littéral avant de passer l'argument à xdotool).
steeldriver
@steeldriver hit-and-miss. Ce fut l'une des premières choses que j'ai essayées et qui n'a pas fonctionné.
muru
@steeldriver Ce qui a fonctionné a été deux nouvelles lignes (deux entrées avant de fermer le 'ou les deux \navec l' $astuce).
muru
c'est étrange, la nouvelle ligne supplémentaire ne semble pas être nécessaire pour moi - je me demande si cela dépend de l'application qui possède la fenêtre cible (j'utilisais un document vide dans geany)?
steeldriver
@steeldriver merci pour le pourboire. Heureux de savoir que je n'hallucinais pas sur la nécessité de sleep(voir la note en petit texte). Je ne changeais pas les fenêtres et je les essayais simplement sur la même fenêtre, mais avec a sleep 1, les deux méthodes fonctionnaient avec la même fenêtre et après le changement. Je suppose que ma propre touche Entrée a interféré d'une manière ou d'une autre avec la nouvelle ligne xdotool. Cependant, pour l'exigence plus complexe d'un fichier de bureau, je recommanderais toujours le script.
muru
1

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 également faire d'autres choses shell ...

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

Notez que la commande "date" utilisée dans ce dernier inclut une nouvelle ligne! et "xdotool" le sortira.

REMARQUE: si vous faites cela en tant que macro clavier, j'ajouterais également quelques options supplémentaires à "xdotool" pour améliorer le fonctionnement ...

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