如何保持 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.
我正在尝试重定向程序的标准输入和标准输出。我目前正在试验 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.