![在 Bash 中发送模拟击键](https://linux22.com/image/1360394/%E5%9C%A8%20Bash%20%E4%B8%AD%E5%8F%91%E9%80%81%E6%A8%A1%E6%8B%9F%E5%87%BB%E9%94%AE.png)
我最近一直在尝试编写一个可用于自动化我的 C++ 程序在 bash 中。如果您了解 AutoIt,我可以简单地向您展示我正在尝试做的一个示例:
send("1{enter}")
或者
send("!a")
OK 对于那些不懂 AutoIt 的人来说:
第一个例子发送一个模拟的“1”键击,然后是一个回车键(CR)
第二个示例发送 alt-a
我专门尝试这样做狂欢。没有其他脚本语言可以做到这一点
另外,我会不是更喜欢用勺子喂食。请指定如何编写。不允许为我写剧本。
答案1
要将文本输入到程序的标准输入中,请使用管道和/或重定向:
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 块,打印一行,丢弃其余部分。)
答案2
答案3
我最喜欢的是“tmux”。
警告 - 这里有些程度的灌输,尽管这个问题已经足够古老,原作者无疑已经完成了他们最初打算做的事情。
您可以轻松地在后台启动 tmux,启动应用程序。Tmux 提供了一个 API 来向应用程序发送按键,以及在您想要与应用程序交互时将应用程序连接到终端。
例子:
$ tmux new-session -d -s Super
$ tmux send-keys -t Super: "uuid" "Enter"
$ tmux capture-pane -t Super: -S - -E - -p | cat -n
$ uuid
fe253d00-3432-11eb-9984-cb225a8f7d48
$ tmux kill-session -t Super:
new-session -d -s Super
Super
创建一个名为“background”的新会话(-d)。注意-s
,new-session 的名称为会议。我还没有命名要运行的应用程序,因此启动了一个 shell。
send-keys -t Super: "command" "Enter"
发送按键。Tmux 可以识别许多关键字,例如 Enter、PgUp、Escape 等,否则send-keys -t Super: $'command\n'
也可以通过发送 UTF 和原始代码。请注意,-t
指的是目标其中包括[session]:[window id]:[pane #]
。由于我只有默认窗口和窗格,因此我将它们留空并仅引用会话。如果我知道没有其他会话正在运行,我可以-t
完全省略。
capture-pane -t Super: -S [start] -E [end] -p
复制窗口的内容。默认情况下,窗格会被捕获到内部缓冲区,您可以将其保存或粘贴到其他窗口。这-p
会导致内容被传输到屏幕上。请注意,捕获的数据可能比整个屏幕长得多。
最好的部分是,如果您让应用程序或会话保持运行,tmux attach -t Super:
它将把您带入正在运行的会话,以便您可以与该应用程序进行交互。
许多人使用 tmux 来启动长时间运行的交互式程序,作为他们以后可以附加的后台服务,或作为自动化测试解决方案的一部分。