【问题标题】:How can I keep a FIFO open for reading?如何保持 FIFO 打开以供读取?
【发布时间】:2020-12-17 19:43:42
【问题描述】:

我正在尝试重定向程序的标准输入和标准输出。我目前正在对此进行 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”,而是在第一个回显之后,第二个回显之后的两行,然后终端 2 中的 test.sh 程序退出.如何防止退出,以便继续发送 test.sh 输入?另外,当程序终止时,我怎样才能将 test.sh 的输出刷新到终端 1 中的 tail -f,而不是缓冲然后转储?

【问题讨论】:

    标签: linux bash mkfifo


    【解决方案1】:

    对包含两个 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&gt; in 将阻塞,直到某些东西(在您的情况下为 test.sh)打开 in 进行读取,并且由于缓冲,您可能看不到来自 tail -f out 的任何输出,直到您关闭文件描述符 3。

    【讨论】:

    • 后者正是我所追求的——谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-17
    • 1970-01-01
    • 2015-03-25
    • 1970-01-01
    相关资源
    最近更新 更多