Esegui diversi comandi xdotool in una riga separata l'una dall'altra


11

Sto cercando di eseguire xdotool type wordquindi xdotool key Returnda Preferenze di avvio applicazioni.
Ma se uso &&o ;, xdotool lo valuta come continuazione dell'input.


1
Nel mio caso d'uso funziona xdotool type $'word\r', dove $''sfugge \ra qualcosa come return ( \nnon funziona qui).
Scz,

Risposte:


16

Per farla breve:
usa una sceneggiatura.

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

E metti il ​​percorso della sceneggiatura nel Execcampo.


Lunga storia:

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

Il concatenamento dei comandi tramite ;o &non è possibile, poiché si tratta della sintassi della shell e Startup Applications non supporta la sintassi della shell. Tuttavia, se tutto ciò che desideri è premere Enterdopo aver digitato qualcosa, c'è un modo rotatorio per farlo.

Quando dice "ASCII" newline, non significa un nudo \n. E la sostituzione di comando ( xdotool type "$(printf '\n')", diciamo) mangia nuove righe finali. Dopo questo xdotoolspost sul forum , ho provato questo:

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

E ha funzionato. Ma funziona solo se c'è un carattere dopo il \n, e questo ovviamente lascia uno spazio finale, che non sarebbe quello che vuoi. L'ho modificato in:

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

E questo funziona e non lascia spazio finale. Tuttavia, potrebbe causare problemi a chi utilizza la modalità Vi nella propria shell.

Grazie ai commenti di @ steeldriver ho capito che ciò era dovuto al fatto che lo provavo proprio sul terminale sul quale stavo eseguendo i comandi. Solo un piccolo divario tra la mia pressione Entere il xdotoolcomando era sufficiente per una singola riga nuova da registrare correttamente. Così:

sleep 0.1; xdotool type $'date\n'

Quindi o estendere la linea citandola:

xdotool type 'date
'

o usando l'interpretazione della shell come suggerito da @steeldriver sembra l'opzione giusta.

Tuttavia, uno script contenente:

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

sul Execcampo ha funzionato bene. In effetti, consiglio sempre di usare uno script per comandi complessi in un file desktop.

Puoi avere uno script con /usr/bin/xdotoolnello shebang, ma la manpage dice "la scriptmodalità non è del tutto definita e potrebbe cadere al di sotto delle tue aspettative", quindi mi sono attaccato agli script.

Avrei potuto vedere delle cose, ma nei miei primi due tentativi, ho dovuto mettere un (piccolo) sleeptra i comandi typeekey . Quello era un artefatto di provarlo sul terminale che stava eseguendo i comandi invece di un'altra finestra.


Una newline letterale sembra funzionare, cioè xdotool type 'wordseguita dal tasto 'Invio' e quindi dalla chiusura ', come fa $'word\n'(in cui bash espande il carattere \na una nuova riga letterale prima di passare l'argomento a xdotool).
steeldriver,

@steeldriver incostante. Questa è stata una delle prime cose che ho provato e non ha funzionato.
muru,

@steeldriver Quello che ha funzionato erano due newline (due Entri prima di chiudere la 'o due \ns con il $trucco).
muru,

è strano, la newline extra non sembra essere necessaria per me - mi chiedo se dipende dall'applicazione che possiede la finestra di destinazione (stavo usando un documento vuoto in Geany)?
steeldriver,

@steeldriver grazie per la punta. Sono contento di sapere che non stavo allucinando sulla necessità sleep(vedi la nota in piccolo testo). Non stavo cambiando windows e stavo solo provando sulla stessa finestra, ma con un sleep 1, entrambi i metodi hanno funzionato sia con la stessa finestra che dopo il passaggio. Immagino che il mio tasto Invio abbia interferito in qualche modo con la newline di xdotool. Tuttavia, per il requisito più complesso di un file desktop, consiglierei comunque lo script.
muru,

1

Mi sembra che l'applicazione non stia analizzando più comandi, ma trattandola come un singolo comando. Come tale lo rendono un singolo comando racchiudendolo in una chiamata shell ...

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

Ora puoi anche fare altre cose di shell ...

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

Nota che il comando "date" usato in quest'ultima include una nuova riga! e "xdotool" lo produrrà.

NOTA: se lo stai facendo come una macro di tastiera, aggiungerei anche alcune altre opzioni a "xdotool" per migliorare il funzionamento ...

bash -c 'xdotool type --clearmodifiers -delay 0 "`date +"%Y-%m-%d_%T`"'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.