如何从bash中的命名管道读取块

时间:2018-12-17 14:20:46

标签: linux bash pipe fifo mkfifo

我有一条命令可能会将大量数据输出到stdout,我需要通过ftp将其上传到远程位置。

我发现了这个问题Upload output of a program directly to a remote file by ftp,我非常喜欢将输出重定向到命名管道,然后从中读取垃圾的想法。但是,一旦我通过dd读取了第一个块,输入到管道中的命令就会退出,并且没有更多数据要从管道中读取。

为了测试这一点,我创建了一个fifo

#> mkfifo fifo

然后我在一个shell上写了fifo:

#> echo bla  > fifo

在另一个外壳上,我从中读取:

#> dd if=fifo of=spool.1 bs=1 count=1

它将第一个字节输出到spool.1中,然后退出写入管道的命令,而我无法从管道中读取剩余数据。

我想从该管道中读取下一个块,但我无法弄清楚自己在做什么错

有什么主意如何保持该管道打开,直到从中读取所有数据?

1 个答案:

答案 0 :(得分:3)

dd需要从标准输入中读取,而不是打开和关闭管道本身,以保持echo的写入端处于打开状态。关闭写端后,就无法再打开读端。

例如

{ 
  dd of=spool.1 bs=1 count=1
  dd of=spool.2 bs=2 count=2
  dd of=spool.2 bs=2 count=2
} < fifo

fifo为复合命令{...}打开一次,并且对dd的每次调用都会继承相同的打开文件描述符,而不会关闭它。