如何保持 FIFO 打开以供读取?

How can I keep a FIFO open for reading?

我正在尝试重定向程序的标准输入和标准输出。我目前正在试验 bash 模型,但我遇到了一些奇怪的行为。

我有以下内容:

mkfifo in
mkfifo out

我还有下面的脚本,test.sh

#!/bin/bash

while read line; do
  echo "I read ${line}"
done < /dev/stdin

在 1 号航站楼,我执行以下操作:

tail -f out

在 2 号航站楼,我执行以下操作:

./test.sh < in > out

在 3 号航站楼,我执行以下操作:

echo "foo" > in
echo "bar > in

但是,在终端 1 中我没有看到“I read foo”后跟“I read bar”,而是在第一个回显之后什么都没有,在第二个回显之后两行,然后是 test.sh 程序在 2 号航站楼出口。我怎样才能阻止退出,以便我可以继续发送 test.sh 输入?另外,不是在程序终止时进行缓冲然后转储,而是如何让 test.sh 的输出刷新到终端 1 中的 tail -f?

在包含两个 echo 命令的单个复合命令上使用重定向。

{
  echo "foo"
  echo "bar"
} > in

如果仔细阅读,您希望 in 在交互式执行命令时保持打开状态,请使用 exec 在另一个文件描述符上打开 in

exec 3> in      # Open in on file descriptor 3
echo "foo" >&3  # Write to file descriptor 3 instead of standard output
echo "bar" >&3  # "
exec 3>&-       # Close file descriptor 3

请注意,exec 3> in 将阻塞,直到某些东西(在您的情况下为 test.sh)打开 in 进行阅读,并且由于缓冲,您可能看不到 [=19 的任何输出=] 直到你关闭文件描述符 3.