Execute vários comandos xdotool em uma linha separada uns dos outros

8

Estou tentando executar xdotool type word , em seguida, xdotool key Return nas Preferências de aplicativos de inicialização.
Mas se eu usar && ou ; , o xdotool avalia como continuação de entrada.

    
por janot 23.08.2014 / 20:50

2 respostas

11

longa história curta:
Use um script.

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

E coloque o caminho do script no campo Exec .

Longa história:

De acordo com a xdotool manpage :

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

O encadeamento de comandos via ; ou & não é possível, já que é a sintaxe do shell e o Startup Applications não suporta a sintaxe do shell. No entanto, se tudo o que você deseja fazer é pressionar Enter depois de digitar algo, há uma maneira indireta de fazer isso.

Quando estiver escrito "ASCII", não significa \n . E a substituição de comando ( xdotool type "$(printf '\n')" , digamos) come novas linhas. Depois dessa xdotools postagem no fórum , tentei fazer isso:

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

E funcionou. Mas isso só funciona se houver algum caractere após o \n , e isso obviamente deixa um espaço à direita, o que não seria o que você deseja. Eu modifiquei isso para:

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

E isso funciona e não deixa espaço à direita. No entanto, isso pode causar problemas para aqueles que usam o modo Vi em seu shell.

Obrigado a @ comments do steeldriver Eu percebi que isso era devido a eu tentar no terminal em que eu estava executando os comandos. Apenas uma pequena diferença entre pressionar Enter e o comando xdotool foi suficiente para que uma única nova linha fosse registrada corretamente. Assim:

sleep 0.1; xdotool type $'date\n'

Então, estendendo a linha, citando-a:

xdotool type 'date
'

ou usando a interpretação do shell, como sugerido pela @steeldriver, parece a opção correta.

No entanto, um script contendo:

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

no campo Exec funcionou bem. Na verdade, sempre recomendo usar um script para comandos complexos em um arquivo de área de trabalho.

Você pode ter um script com /usr/bin/xdotool no shebang, mas a página de manual diz que " script mode não foi totalmente desenvolvido e pode ficar abaixo de suas expectativas", então eu me basei nos scripts bash.

Eu poderia estar vendo coisas, mas no meu primeiro par de tentativas, eu tive que colocar um (pequeno) sleep entre os comandos type e key . Isso foi um artifício de tentar no terminal que estava executando os comandos em vez de outra janela.

    
por muru 23.08.2014 / 22:39
0

Parece-me que o aplicativo não está analisando vários comandos, mas tratando-o como um único comando. Como tal, crie um único comando, encapsulando-o em uma chamada de shell ...

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

Agora você também pode fazer outras coisas de shell ...

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

Note que o comando "date" usado no último inclui uma nova linha! e "xdotool" irá mostrar isso.

NOTA: se você está fazendo isso como uma macro de teclado, eu também adicionaria mais algumas opções para "xdotool" para tornar este trabalho melhor ...

bash -c 'xdotool type --clearmodifiers -delay 0 "'date +"%Y-%m-%d_%T'"'
    
por anthony 18.12.2014 / 03:45