Отправка симулированных нажатий клавиш в Bash

19

Недавно я пытался написать скрипт, который можно использовать для автоматизации моей программы на c ++ в bash. Если вы знаете AutoIt, я могу просто показать вам пример того, что я пытаюсь сделать:

send("1{enter}")

или

send("!a")

ОК Для тех, кто не говорит AutoIt:

В первом примере отправляется смоделированное нажатие клавиши «1», за которым следует ввод (CR)

Второй пример отправляет alt-a

Я специально пытаюсь сделать это в Bash . Никакой другой язык сценариев не подойдет

Кроме того, я не предпочел бы кормить с ложечки. Пожалуйста, укажите, как написать это . Написание сценария для меня запрещено.

Ishan
источник
1
Вы автоматизируете командную строку, ncurses или графическую программу?
user1686
1
Сейчас я автоматизирую командную строку. Предполагается, что вход автоматически вводится в cin (консольные входы)
Ишан,

Ответы:

16

Чтобы передать текст в стандартный поток программы, используйте каналы и / или перенаправление :

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, напечатать одну строку, отбросить остальные.)

user1686
источник
Оба ответа одинаково хороши. Но это то, что я больше искал.
Ишан
Что подразумевается под программой CLI / полным терминалом?
Крис Стрычински
CLI обозначает интерфейс командной строки. Программа CLI - это простая программа, которая запускается из командной строки и обычно использует stdin и stdout, поскольку выполняет некоторую задачу, а затем завершает выполнение и возвращается к приглашению командной строки. grepи curlявляются хорошими примерами этого. Полная терминальная программа - это то, что берет на себя управление всем окном, как vimи screen.
Тревин Эйвери
16

Вы ищете xdotool .

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

xdotool key 1 Return
xdotool keydown Alt key a keyup Alt
Деннис
источник
это хорошо. но я думал о каком-то чистом коде bash
Ишан
9
@Ishan: Практически невозможно делать такие вещи с чистым кодом Bash . Bash не может напрямую использовать X11 и не может использовать любую существующую библиотеку X11. Вам нужно было бы подключиться к сокету X11 напрямую (bash выполняет только TCP, а не Unix-сокеты), вручную проанализировать протокол X11 (синтаксический анализ двоичных данных в bash обречен на сбой) и создать соответствующие ответы. Bash - это оболочка, она предназначена для работы с помощью цепочки внешних инструментов.
user1686