Mengirim keystrokes yang disimulasikan di Bash

19

Saya baru-baru ini mencoba menulis skrip yang dapat digunakan untuk mengotomatisasi program c ++ saya di bash. Jika Anda tahu AutoIt, saya bisa menunjukkan kepada Anda contoh dari apa yang saya coba lakukan:

send("1{enter}")

atau

send("!a")

OK Untuk mereka yang tidak berbicara AutoIt:

Contoh pertama mengirimkan simulasi keystroke "1" diikuti oleh enter (CR)

Contoh kedua mengirimkan alt-a

Saya secara khusus mencoba melakukan ini di bash . Tidak ada bahasa scripting lain yang akan dilakukan

Juga, saya tidak akan memilih spoonfeed. Silakan tentukan cara menulisnya . Tidak diizinkan menulis skrip untuk saya.

Ishan
sumber
1
Apakah Anda mengotomatiskan baris perintah, ncurses, atau program grafis?
user1686
1
Saya mengotomatisasi baris perintah untuk saat ini. Seharusnya memberi makan input ke cin (input konsol) secara otomatis
Ishan

Jawaban:

16

Untuk memasukkan teks ke stdin program, gunakan pipa dan / atau pengalihan :

echo 1 | myprogram

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

myprogram <<EOF
First line
Second line
EOF

Dalam hal program CLI interaktif ( bukan yang terminal penuh), dimungkinkan untuk menggunakan pipa atau coprocess bernama sebagai semacam orang miskin expect(yang Anda singkirkan karena menjadi 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]}

(Hati-hati saat membaca dari pipa keluaran; mis. Tidak head -1 <outakan hanya membaca satu baris - itu akan buffer satu blok 4k penuh, cetak satu baris, buang sisanya.)

pengguna1686
sumber
Kedua jawaban itu sama-sama bagus. Tapi, ini yang saya cari.
Ishan
Apa yang dimaksud dengan program CLI / terminal penuh?
Chris Stryczynski
CLI adalah singkatan dari Command Line Interface. Program CLI adalah program sederhana yang berjalan pada baris perintah dan umumnya menggunakan stdin dan stdout ketika melakukan beberapa tugas dan kemudian menyelesaikan eksekusi dan kembali ke prompt baris perintah. grepdan curlmerupakan contoh yang baik untuk ini. Program terminal penuh adalah sesuatu yang mengendalikan seluruh jendela, seperti vimdan screen.
Trevin Avery
16

Anda sedang mencari xdotool .

Setara dengan xdotool dari contoh perintah Anda adalah:

xdotool key 1 Return
xdotool keydown Alt key a keyup Alt
Dennis
sumber
ini bagus. tapi saya berpikir tentang beberapa kode bash murni
Ishan
9
@Ishan: Praktis mustahil melakukan hal seperti itu dengan kode bash murni . Bash tidak dapat menggunakan X11 secara langsung, dan juga tidak dapat menggunakan pustaka X11 yang ada. Anda harus terhubung ke soket X11 secara langsung (bash hanya melakukan TCP, bukan soket Unix), parsing protokol X11 dengan tangan (parsing data biner di bash ditakdirkan untuk gagal) dan menyusun respons yang sesuai. bash adalah sebuah shell, ia dirancang untuk bekerja dengan merantai alat eksternal.
user1686