Führen Sie mehrere xdotool-Befehle in einer voneinander getrennten Zeile aus

11

Ich versuche xdotool type worddann xdotool key Returnvon Startup Aplications Preferences aus zu laufen .
Aber wenn ich &&oder ;benutze, wertet xdotool es als Fortsetzung der Eingabe aus.

Janot
quelle
1
In meinem Anwendungsfall funktioniert es mit xdotool type $'word\r', wo das zu so etwas wie Rückkehr $''entkommt \r( \nfunktioniert hier nicht).
Scz

Antworten:

16

Lange Rede, kurzer
Sinn : Verwenden Sie ein Skript.

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

Und setzen Sie den Pfad des Skripts in das ExecFeld.


Lange Geschichte:

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

Befehlsverkettung über ;oder &ist nicht möglich, da dies Shell-Syntax ist und Startup Applications keine Shell-Syntax unterstützt. Wenn Sie jedoch Enternach dem Eingeben nur etwas drücken möchten , gibt es einen Umweg.

Wenn "ASCII" Newline steht, bedeutet das nicht nackt \n. Und die Befehlssubstitution (z xdotool type "$(printf '\n')". B.) frisst nachgestellte Zeilenumbrüche. Nach diesem xdotoolsForumsbeitrag habe ich Folgendes versucht:

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

Und es hat funktioniert. Aber es funktioniert nur, wenn es nach dem einen Charakter gibt \n, und dies lässt offensichtlich einen nachgestellten Raum übrig, der nicht das wäre, was Sie wollen. Ich habe das geändert zu:

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

Und das funktioniert und lässt keinen nachlaufenden Raum. Dies kann jedoch zu Problemen für Benutzer führen, die den Vi-Modus in ihrer Shell verwenden.

Dank der Kommentare von @ steeldriver habe ich herausgefunden, dass ich es auf dem Terminal ausprobiert habe, auf dem ich die Befehle ausgeführt habe. Nur eine kleine Lücke zwischen meinem Drücken Enterund dem xdotoolBefehl reichte aus, um eine einzelne neue Zeile korrekt zu registrieren. Somit:

sleep 0.1; xdotool type $'date\n'

Erweitern Sie also entweder die Zeile, indem Sie sie zitieren:

xdotool type 'date
'

oder die Verwendung der Shell-Interpretation, wie von @steeldriver vorgeschlagen, scheint die richtige Option zu sein.

Ein Skript enthält jedoch:

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

auf dem ExecFeld hat gut funktioniert. In der Tat empfehle ich immer die Verwendung eines Skripts für komplexe Befehle in einer Desktop-Datei.

Sie können ein Skript mit /usr/bin/xdotoolim Shebang haben, aber die Manpage sagt " scriptModus ist nicht vollständig ausgearbeitet und kann unter Ihren Erwartungen liegen", also habe ich mich an Bash-Skripte gehalten.

Ich habe vielleicht Dinge gesehen, aber in meinen ersten Versuchen musste ich ein (kleines) sleepzwischen die Befehle typeund setzenkey . Das war ein Artefakt beim Ausprobieren auf dem Terminal, das die Befehle anstelle eines anderen Fensters ausführte.

muru
quelle
Eine wörtliche neue Zeile scheint zu funktionieren, dh xdotool type 'wordgefolgt von der Eingabetaste und dem Schließen ', wie dies der Fall ist $'word\n'(wobei bash die \nZeile zu einer wörtlichen neuen Zeile erweitert, bevor das Argument an übergeben wird xdotool).
Steeldriver
@steeldriver Hit-and-Miss. Das war eines der ersten Dinge, die ich versuchte und die nicht funktionierten.
Muru
@steeldriver Was funktioniert hat, waren zwei Zeilenumbrüche (zwei Eingaben vor dem Schließen der ein 'oder zwei \ns mit dem $Trick).
Muru
das ist seltsam, der zusätzliche Zeilenumbruch scheint für mich nicht notwendig zu sein - ich frage mich, ob es von der Anwendung abhängt, der das Zielfenster gehört (ich habe ein leeres Dokument in geany verwendet)?
Steeldriver
@steeldriver danke für den Tipp. Ich bin froh zu wissen, dass ich nicht über die Notwendigkeit halluziniert habe sleep(siehe den Hinweis in kleinem Text). Ich habe nicht die Fenster gewechselt und es nur im selben Fenster ausprobiert, aber mit a sleep 1funktionierten beide Methoden sowohl im selben Fenster als auch nach dem Wechsel. Ich denke, mein eigener Enter-Tastendruck hat die xdotool-Newline irgendwie gestört. Für die komplexeren Anforderungen einer Desktop-Datei würde ich das Skript dennoch empfehlen.
Muru
1

Mir scheint, die Anwendung analysiert nicht mehrere Befehle, sondern behandelt sie als einen einzigen Befehl. Machen Sie es zu einem einzigen Befehl, indem Sie einen Shell-Aufruf einschließen ...

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

Jetzt können Sie auch andere Shell-Dinge tun ...

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

Beachten Sie, dass der zuletzt verwendete Befehl "Datum" eine neue Zeile enthält! und "xdotool" gibt es aus.

HINWEIS: Wenn Sie dies als Tastaturmakro tun, würde ich "xdotool" noch einige weitere Optionen hinzufügen, damit dies besser funktioniert ...

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