在Bash中发送模拟的击键


19

我最近一直在尝试编写一个脚本,该脚本可用于在bash中自动执行我的c ++程序。如果您了解AutoIt,我可以简单地向您展示我要做的事的一个示例:

send("1{enter}")

要么

send("!a")

确定对于不讲AutoIt的用户:

第一个示例发送模拟的“ 1”键,然后输入enter(CR)

第二个示例发送alt-a

我专门尝试用bash做到这一点。没有其他脚本语言可以做

另外,我喜欢汤匙喂食。请指定如何编写。禁止为我编写脚本。


1
您要自动执行命令行,ncurses或图形程序吗?
user1686

1
我现在正在自动化命令行。它应该将输入自动输入到cin(控制台输入)中
Ishan 2013年

Answers:


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块,打印一行,其余部分丢弃。)


这两个答案都同样好。但是,这是我最想要的。
Ishan

CLI程序/完整终端是什么意思?
克里斯·斯特里钦斯基

CLI代表命令行界面。CLI程序是一个简单的程序,可在命令行上运行,并在执行某些任务后通常使用stdin和stdout,然后完成执行并返回命令行提示符。grepcurl就是这方面很好的例子。完整的终端程序可以控制整个窗口,例如vimscreen
Trevin Avery

16

您正在寻找xdotool

xdotool与您的示例命令等效:

xdotool key 1 Return
xdotool keydown Alt key a keyup Alt

很好 但是我在考虑一些纯粹的bash代码
Ishan

9
@Ishan:使用纯bash代码实际上是不可能的。Bash不能直接使用X11,也不能使用任何现有的X11库。您将必须直接连接到X11套接字(bash仅使用TCP套接字,而不是Unix套接字),用手解析X11协议(解析bash中的二进制数据注定会失败),然后制定适当的响应。bash是一个外壳,旨在通过链接外部工具来工作。
2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.