我有一条命令可能会将大量数据输出到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中,然后退出写入管道的命令,而我无法从管道中读取剩余数据。
我想从该管道中读取下一个块,但我无法弄清楚自己在做什么错
有什么主意如何保持该管道打开,直到从中读取所有数据?
答案 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
的每次调用都会继承相同的打开文件描述符,而不会关闭它。