【发布时间】:2022-01-21 17:20:46
【问题描述】:
我真的很困惑,我不知道发生了什么,所以我不确定要问什么:/
我打算使用 this question 在 bash 脚本中将输入发送到程序的标准输入(我希望 program.c 在标准输入上读取并打印它读取的内容,我使用 readline 做到这一点没有问题,我希望scrit.sh 将program.c 将读取的内容发送到stdin,而我正在以一种复杂的方式进行操作,当我意识到我的代码中间带有read 的while 循环已经完成了这项任务时,我不知道为什么!)
所以它不需要我故意向 STDIN 发送任何东西(我显然这样做,但在编写这个循环时这不是我的意图),但我不明白发生了什么
这是它的外观:我使用 bash 脚本调用 program.c,它使用 readline 读取标准输入并打印它。我在下面写的 script.sh 绝对不应该适用于我所理解的(不多),但它(几乎)可以!
program.c:
#include <unistd.h>
#include <stdlib.h>
#include <readline/readline.h>
int main(void)
{
char *line_input;
line_input = readline("[myPrompt]> ");
if (!line_input)
{
write(1, "exit\n", 5);
exit(0);
}
write(1, line_input, strlen(line_input));
write(1, "\n", 1);
return (0);
}
script.sh:
#!/bin/bash
VAR="\
one
two"
while read -r line
do
echo "line: $line"
./program
done < <(echo "$VAR")
和输出:
line: one
[myPrompt]> two
two
[myPrompt]> exit
所以two这个词写在[myPrompt]> 的右边,我猜是标准输入,它是由./program.c执行的
为什么?我从来没有发送过它,我只是在脚本的 while 循环中调用了./program,但它没有向标准输入发送任何内容
为什么它从第二个单词开始?
如果我不在循环中使用 read,我将无法重现此行为,因此它可能是相关的
【问题讨论】:
-
你真的执行了
./program.c吗? C源代码不能执行,需要编译。 -
why ? i never sent it你认为< <(echo "$VAR")是什么意思?why does it start at the second word ?因为read -r line读取第一行。我认为您可能错过了这样一个事实,即while stuff1; do stuff2. done < this_here将标准输入重定向到stuff1,但也 重定向到stuff2- 循环内的内容也将标准输入连接到重定向。 -
@Barmar ho,这是一个错误!我会编辑我的问题 ;) (
./program.c->./program) -
@KamilCuk 确实我完全错过了这个事实:) 你在评论中解释了一切,这可能是公认的回答