Надсилання імітованих натискань клавіш у Bash


19

Нещодавно я намагався написати сценарій, який можна використовувати для автоматизації моєї програми c ++ в bash. Якщо ви знаєте AutoIt, я можу просто показати вам приклад того, що я намагаюся зробити:

send("1{enter}")

або

send("!a")

OK Для тих, хто не розмовляє з AutoIt:

Перший приклад надсилає імітований натискання клавіші "1", після якого вводиться (CR)

Другий приклад посилає alt-a

Я спеціально намагаюся це зробити в баш . Жодна інша мова сценаріїв не зробить

Також я б не віддав перевагу ложці. Вкажіть, будь ласка, як це написати . Не дозволяється писати сценарій для мене.


1
Ви автоматизуєте командний рядок, ncurses або графічну програму?
користувач1686

1
Я зараз автоматизую командний рядок. Він повинен автоматично вводити вхід у cin (консольні входи)
Ішан

Відповіді:


16

Щоб подати текст у stdin програми, використовуйте труби та / або перенаправлення :

echo 1 | myprogram

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

myprogram <<EOF
First line
Second line
EOF

У разі інтерактивних програм CLI ( не повних терміналів), ви можете використовувати названі труби або копроцеси як різновид бідолахи expect(яку ви виключили через 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]}

(Будьте уважні, читаючи з вихідної труби; наприклад head -1 <out, не буде прочитати один рядок - він буде буферизувати один повний блок 4k, надрукувати один рядок, відкинути решту.)


Обидві відповіді однаково хороші. Але це те, що я більше шукаю.
Ішан

Що розуміється під програмою CLI / повним терміналом?
Кріс Стричинський

CLI - інтерфейс командного рядка. Програма CLI - це проста програма, яка працює в командному рядку і, як правило, використовує stdin та stdout, коли виконує якесь завдання, а потім закінчує виконання та повертається до командного рядка. grepі curlє хорошими прикладами цього. Повна термінальна програма - це те, що контролює все вікно, як-от vimі screen.
Тревін Евери

16

Ви шукаєте xdotool .

Еквівалент xdotool ваших прикладних команд:

xdotool key 1 Return
xdotool keydown Alt key a keyup Alt

це добре. але я думав про якийсь чистий баш-код
Ішан

9
@Ishan: Такі речі практично неможливо робити з чистим баш-кодом . Bash не може використовувати X11 безпосередньо, і він також не може використовувати будь-яку існуючу бібліотеку X11. Вам доведеться підключитися безпосередньо до сокета X11 (башти виконуються лише TCP, а не сокети Unix), вручну проаналізувати протокол X11 (аналіз бінарних даних у bash призначений для виходу з ладу) та скласти відповідні відповіді. bash - оболонка, він призначений для роботи ланцюжком зовнішніх інструментів.
користувач1686
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.