Bash:在读取/写入命名管道时替代cat

时间:2012-07-02 10:01:32

标签: bash

我正在启动一个进程,并将其输出重定向到命名管道。我正在使用cat > $pipe重新连接到命名管道。当进程'stdout死亡而没有轮询父进程'死亡时,如何设置命名管道死?

除此之外,还可以使用cat以外的其他内容来打开命名管道吗?

2 个答案:

答案 0 :(得分:5)

一个fifo总是准备好来读写,所以像cattail -f这样的程序永远不会停止阅读。您要检查的是是否有一个进程写入该文件,如果没有这样的进程,请停止阅读。 (顺便说一下,读取文件的最佳方法是read。)

lsof可以告诉您从/向指定文件读取和写入的人员。查看其手册页,并尝试类似:

while lsof /path/to/fifo
do 
    read -r line < /path/to/fifo
    printf "%s\n" "$line"
done

我不确定,也没有时间查看lsof,找出哪个选项只输出到该文件的进程。请在手册页上查看。
因此,只要有一个写入fifo的进程,这个脚本就会读取一行并打印出来。一旦没有进程写入文件,循环就会中断并且脚本退出。

我不知道另一种检查是否有进程写入除lsof以外的文件的方法。如果有人知道更标准的方式,我也想知道。

答案 1 :(得分:0)

cat > $pipe写入管道,而不是从管道读取。

如果您想从管道中读取数据并在终端上打印,请尝试tail -f $pipe

-f选项使tail保持运行,并在将新数据写入管道时打印输出。

另请参阅Linux Journal的此article