【发布时间】:2020-05-13 09:25:14
【问题描述】:
已针对多种语言提出此问题,但我尚未找到 bash 风格的重复项。
假设我有一个程序在写入stdout 和读取stdin 之间交替。
#include <stdio.h>
/*
* Control_D to exit.
*/
int main(int argc, char** argv){
char init = 'C';
if (argc > 1) {
init = *argv[1];
}
putchar(init);
putchar('\n');
while (1) {
int c = getchar();
if (c == -1) {
return 0;
}
putchar(c);
putchar('\n');
}
}
我想编写一个 bash 脚本,它读取程序编写的内容,然后决定编写标准输入的内容,并重复执行此操作。也就是说,像这样:
myProgram &
for i in $(seq 1 10);
do
output=$(# magic command to read myProgram stdout)
if [[ $output = "C" ]]; then
# Magic command to write 'C' to myProgram input
fi
if [[ $output = "D" ]]; then
# Magic command to write 'E' to myProgram input
done
我最初尝试使用named pipes 执行此操作,但这不起作用,因为管道要求在开始之前打开两端并且使用各种exec 技巧无法解决这些限制。我并没有将它们排除在解决方案之外,只是指出我不够聪明,无法让它们发挥作用。
这些神奇的命令是否存在于 bash 中,还是我必须切换到另一种语言?
为了这个问题,我们假设我无法控制myProgram,也无法指定它如何通信;它只理解标准输入和标准输出,因为它旨在供用户以交互方式使用。
【问题讨论】:
-
在 putchar 之后刷新标准输出时,命名管道工作正常。