Ejecute varios comandos xdotool en una línea separados uno del otro

11

Estoy tratando de ejecutar xdotool type worda continuación, xdotool key Returna partir de aplicaciones de inicio de Preferencias.
Pero si uso &&o ;, xdotool lo evalúa como una continuación de la entrada.

janot
fuente
1
En mi caso de uso, funciona xdotool type $'word\r', donde $''escapa \ra algo así como retorno ( \nno funciona aquí).
Scz

Respuestas:

16

Larga historia corta:
usa un guión.

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

Y ponga la ruta del guión en el Execcampo.


Larga historia:

Según la página del xdotoolmanual :

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'.

El encadenamiento de comandos a través de ;o &no es posible, ya que esa es la sintaxis de shell y Startup Applications no admite la sintaxis de shell. Sin embargo, si todo lo que desea hacer es presionar Enterdespués de escribir algo, hay una forma indirecta de hacerlo.

Cuando dice nueva línea "ASCII", no significa nada \n. Y la sustitución de comandos ( xdotool type "$(printf '\n')", por ejemplo) se come las nuevas líneas finales. Después de esta xdotoolspublicación en el foro , probé esto:

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

Y funcionó. Pero solo funciona si hay algún personaje después del \n, y esto obviamente deja un espacio final, que no sería lo que quieres. Lo modifiqué para:

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

Y esto funciona y no deja espacio libre. Sin embargo, puede causar problemas para aquellos que usan el modo Vi en su shell.

Gracias a los comentarios de @ steeldriver me di cuenta de que esto se debía a que lo había probado en la misma terminal en la que estaba ejecutando los comandos. Solo una pequeña brecha entre mi presión Entery el xdotoolcomando fue suficiente para que una nueva línea se registrara correctamente. Así:

sleep 0.1; xdotool type $'date\n'

Entonces, ya sea extendiendo la línea citando:

xdotool type 'date
'

o usar la interpretación de shell como sugirió @steeldriver parece la opción correcta.

Sin embargo, un script que contiene:

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

en el Execcampo funcionó bien. De hecho, siempre recomiendo usar un script para comandos complejos en un archivo de escritorio.

Puede tener un script /usr/bin/xdotoolen el shebang, pero la página de manual dice "el scriptmodo no está completamente desarrollado y puede estar por debajo de sus expectativas", así que me quedé con los scripts de bash.

Podría haber estado viendo cosas, pero en mis primeros intentos, tuve que poner un (pequeño) sleepentre los comandos typeykey . Ese fue un artefacto de probarlo en la terminal que estaba ejecutando los comandos en lugar de otra ventana.

muru
fuente
Una nueva línea literal parece funcionar, es decir, xdotool type 'wordseguida de la tecla 'Entrar' y luego el cierre ', como lo hace $'word\n'(en el cual bash expande la línea \na una nueva línea literal antes de pasar el argumento a xdotool).
steeldriver
@steeldriver al azar. Esa fue una de las primeras cosas que probé y no funcionó.
muru
@steeldriver Lo que funcionó fueron dos líneas nuevas ( dos entradas antes de cerrar las 'o dos \ns con el $truco).
muru
eso es extraño, la nueva línea adicional no parece ser necesaria para mí. Me pregunto si depende de la aplicación que posee la ventana de destino (estaba usando un documento vacío en geany).
steeldriver
@steeldriver gracias por la propina. Me alegra saber que no estaba alucinando sobre la necesidad de sleep(ver la nota en texto pequeño). No estaba cambiando ventanas y solo probándolo en la misma ventana, pero con un sleep 1, ambos métodos funcionaron tanto con la misma ventana como después de cambiar. Supongo que mi propia tecla Intro de alguna manera interfirió con la nueva línea xdotool. Sin embargo, para el requisito más complejo de un archivo de escritorio, todavía recomendaría el script.
muru
1

Me parece que la aplicación no analiza múltiples comandos, sino que la trata como un solo comando. Como tal, conviértalo en un solo comando envolviéndolo en una llamada de shell ...

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

Ahora también puedes hacer otras cosas de shell ...

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

Tenga en cuenta que el comando "fecha" utilizado en ese último incluye una nueva línea! y "xdotool" lo generará.

NOTA: si está haciendo esto como una macro de teclado, también agregaría algunas opciones más a "xdotool" para que funcione mejor ...

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