Invio di tasti simulati in Bash


19

Di recente ho provato a scrivere uno script che può essere usato per automatizzare il mio programma c ++ in bash. Se conosci AutoIt, posso semplicemente mostrarti un esempio di ciò che sto cercando di fare:

send("1{enter}")

o

send("!a")

OK Per coloro che non parlano AutoIt:

Il primo esempio invia una sequenza di tasti "1" simulata seguita da un invio (CR)

Il secondo esempio invia alt-a

Sto specificamente cercando di farlo in bash . Nessun altro linguaggio di scripting farà

Inoltre, non preferirei un cucchiaio. Si prega di specificare come scriverlo . Non è permesso scrivere la sceneggiatura per me.


1
Stai automatizzando una riga di comando, ncurses o un programma grafico?
user1686

1
Sto automatizzando una riga di comando per ora. Dovrebbe alimentare automaticamente gli input in cin (input della console)
Ishan,

Risposte:


16

Per inserire il testo nello stdin di un programma, utilizzare le pipe e / o il reindirizzamento :

echo 1 | myprogram

(echo "First line"
 echo "Second line") | myprogram

myprogram <<EOF
First line
Second line
EOF

Nel caso di programmi CLI interattivi ( non di quelli a terminale completo), è possibile usare pipe o coprocessi nominati come una sorta di uomo povero expect(che hai escluso perché Tcl):

mkfifo in out
myprogram <in >out &
echo "First line" >in
read -r reply <out

mkfifo in out
myprogram <in >out &
exec {infd}>in {outfd}<out
echo "First line" >&$infd
read -r reply <&$outfd

coproc foo { myprogram; }
echo "First line" >&${foo[1]}
read -r reply <&${foo[0]}

(Prestare attenzione quando si legge dalla pipe di output; ad es. head -1 <outNon leggerà solo una riga: bufferizzerà un blocco completo di 4k, stamperà una riga, scarterà il resto.)


Entrambe le risposte sono ugualmente buone. Ma questo è quello che cerco di più.
Ishan,

Cosa si intende per programma CLI / terminale completo?
Chris Stryczynski,

CLI sta per Command Line Interface. Un programma CLI è un semplice programma che viene eseguito dalla riga di comando e generalmente utilizza stdin e stdout mentre esegue alcune attività, quindi termina l'esecuzione e torna al prompt della riga di comando. grepe ne curlsono un buon esempio. Un programma terminale completo è qualcosa che prende il controllo dell'intera finestra, come vime screen.
Trevin Avery,

16

Stai cercando xdotool .

L'equivalente di xdotool dei comandi di esempio sono:

xdotool key 1 Return
xdotool keydown Alt key a keyup Alt

questo è buono. ma stavo pensando a un codice bash puro
Ishan,

9
@Ishan: È praticamente impossibile fare queste cose con puro codice bash . Bash non può usare X11 direttamente e non può usare nessuna libreria X11 esistente. Dovresti connetterti direttamente al socket X11 (bash fa solo TCP, non socket Unix), analizzare il protocollo X11 a mano (l'analisi dei dati binari in bash è destinata a fallire) e creare le risposte appropriate. bash è una shell, progettata per funzionare concatenando strumenti esterni.
user1686
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.