2

我正在尝试构建一个响应简单 C 程序的脚本。我猜脚本需要逐行阅读并解析文本,直到找到问题。然后它必须回复相同的标准输出。脚本以无限循环读取,我在命令行上启动它

./script.sh &

为了让它在后台运行。然后,在同一个终端中,我启动我的 C 程序,该程序在命令行上输出并在 scanf 处等待。我的问题是,这两个进程看起来好像正在与不同的标准输出进行交互,因为它们无法“看到”彼此。显然我误解了一些东西......有什么帮助吗?

#!/bin/bash
for (( ; ; )) do
    while read line; do
        if [ "$line" == ">" ] then
        echo "yes"
        fi
    done
done    
4

2 回答 2

2

使用expect怎么样?Expect 是一个 Unix 工具,用于以编程方式回复交互式应用程序,对于解决像您这样的问题非常有用。当然,您可以在 bash 脚本中使用它。

您的问题的答案将类似于:

#!/bin/bash

expect << EOF
  spawn simple_c_application
  expect ">"
  send "yes\r"
  expect eof
EOF

该脚本将生成您的应用程序,为您检查输出并在输出行包含>时回复yes。您还可以在期望模式中使用锚点:字符匹配行的开头和结尾。因此,仅当该行正好是>时才匹配。 ^$^>$

你只需要从你的包管理器中安装 expect,然后像往常一样使用 bash 脚本。

于 2012-10-23T19:46:13.870 回答
1

mkfifo使用从该套接字文件读取的脚本创建一个套接字文件,而不是从stdin. 从你的 C 程序中打开套接字,open然后写入这个而不是标准输出。

例子:

在终端中输入这个来创建一个套接字文件。

user~$ mkfifo mysocket

将您的脚本更改为:

while :
do
    here=$(<mysocket)
    if [ "$here" == ">" ] then
        echo "yes"
    fi
done

在你的 c 文件中

char* test = ">\n";
int mysocket = open("/home/user/mysocket","w");
int byteswrite = write(mysocket,(void*)test,2);

先运行脚本,然后再运行程序

于 2012-10-23T19:57:16.167 回答