交互程序stdin和stdout(创建一个机器人程序来玩游戏)

交互程序stdin和stdout(创建一个机器人程序来玩游戏)

设置: 我有一个可执行文件,我“无法编辑”,因为我没有源代码。当我执行该程序时,它会显示一个游戏,它通过 给我一些数字stdout,供我计算,当我完成计算后,我可以给出我的答案stdin,它会告诉我计算是否正确。然后我得到一个新的计算,一切都会重复。

问题: 我可以手动玩这个游戏,但我想用程序自动化它。系统上可用的工具是BashC-compiler。与该程序交互的最简单方法是什么?

到目前为止我所做的: 我一直在查看 中的管道C,并运行一个小程序,在其中分叉进程并使用管道在两个进程之间进行通信。 (像这样的东西程序)。但是当我从子进程调用外部二进制文件时,我无法让它工作。

答案1

您可以使用管道和 FIFO 来完成此操作。

例如,这是我的测试脚本blackbox.sh

#!/bin/bash

# Here i output the value to be added.
echo "10 30"

# Here i read the result and depending on it, write good or not good in a file
read result
if [ "${result}" -eq 40 ]; then
    echo good > result.txt
else
    echo not good > result.txt
fi

手动运行:

$ ./blackbox.sh 
10 30 <~~~~ Script output
40 <~~~~~~~ My input
$ cat result.txt 
good
$ 

mkfifo coin现在,我使用以下行创建一个 FIFO并再次运行:

$ rm result.txt && cat coin |./blackbox.sh | ( read a b ; echo $((a+b)) > coin )
$ cat result.txt 
good

注意:

  • 只要未打开 FIFO 进行读取,任何对 FIFO 的写入都会被阻塞。
  • 显然,将 的输出通过管道传递blackbox.sh给某些东西将使您看不到它。
  • 我自愿选择一个简单的示例,其中 blackbox.sh 的输出很容易解析...我让您根据您的需要进行调整。
  • $(( ))允许 Bash 中的算术运算。

相关内容