15

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

send("1{enter}")

или же

send("!a")

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

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

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

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

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

2 ответа2

14

Вы ищете xdotool.

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

xdotool key 1 Return
xdotool keydown Alt key a keyup Alt
11

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

echo 1 | myprogram

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

myprogram <<EOF
First line
Second line
EOF

В случае интерактивных программ CLI (не полные-терминальный из них), можно использовать именованные каналы или coprocesses как своего рода бедный человек 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, печатает одну строку, отбрасывает остальные.)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .