即使在管道关闭后,如何继续从管道中读取数据?

dav*_*s21 5 unix shell ksh shell-script

我有一个 ksh 脚本调用:

while read LINE do...

输入已被重定向(未显示),以便它从管道读取输入。

问题是当管道的写入器关闭时, read 返回 false 并退出循环。

我希望它在管道关闭后继续读取(写入过程可能会不时重新启动,导致这种情况)。

我尝试将整个读取 LINE 包装在一个子外壳中并循环遍历整个子外壳,但是 read 在管道关闭后只得到一个空行,而不是像脚本正常启动时那样阻塞直到有更多输入。

Ric*_*lka 6

在内核中创建管道作为两个进程之间的通信方法。通常是父子关系。如果进程退出,则没有管道。无法将另一个进程附加到内核中管道的另一端。内核会自动启动管道关闭,并将 EPIPE 提供给任何读者。

可以做的是创建一个命名管道。它存在于文件系统中,在退出任何编写程序时都不会关闭。您甚至可以将多个写入器写入管道,尽管我不建议这样做 - 由于缓冲,您认为正在写入的“块”被写入不同的块中。

您在已知目录中创建管道,mkfifo /path/to/pipe并根据您是读者还是作者将 stdin 或 stdout 重定向自/到它。