首页 > 解决方案 > Bash 如何在第一次发送后不中止的情况下向命名管道写入/读取/读取

问题描述

给定:

Bash 命令行(终端 1):

 > mkfifo pipo
 > cat pipo

Bash 命令行(终端 2):

 > echo -e "Hello World\nHi" > pipo

结果:

(1 号航站楼)中的 bash 打印:

 Hello World
 Hi

并中止。

问题:

我怎样才能实现它不会中止,但允许通过发送另一个回声pipo

标签: bashpipemkfifo

解决方案


这是因为echo ... > fifo打开然后关闭fifo。作为一种解决方法,您可以这样做:

# open for writing
exec 20> fifo
echo foo >&20
echo bar >&20
...
# to close it
exec 20>&-

一点解释:

  • exec 20> fifo打开以使用 FD(文件描述符)fifo进行写入20.
  • command >&20将输出重定向到 FD 20。
  • exec 20>&-关闭 FD 20。

以下摘自man bash

  • exec [-cl] [-a名称] [命令[参数]]

    [...] 如果没有指定 command ,任何重定向都在当前shell中生效,返回状态为0。如果有重定向错误,返回状态为1。

  • [ n ]>单词

    输出重定向会导致打开其名称来自word扩展的文件,以便在文件描述符n上写入,如果未指定n,则打开标准输出(文件描述符 1) 。如果文件不存在,则创建它;如果确实存在,则将其截断为零大小。[...]

  • [ n ]>&单词

    [...] 如果word评估为-,则文件描述符n被关闭。[...]


推荐阅读