我有一个 ksh 脚本,它调用:
while read LINE do...
输入已被重定向(未显示),以便它从管道读取输入。
问题是,当管道写入器关闭时,read 返回 false 并退出循环。
我希望它在管道关闭后继续读取(写入过程可能会时不时重新启动,从而导致这种情况)。
我尝试将整个读取行包装在一个子 shell 中并循环遍历整个子 shell,但是读取在管道关闭后只会得到一个空行,而不是像脚本正常启动时那样阻塞直到有更多输入。
答案1
管道是在内核中创建的,是两个进程之间的一种通信方法。它通常是父/子关系。如果一个进程退出,则没有管道。内核中没有办法将另一个进程附加到管道的另一端。内核会自动关闭管道,并将 EPIPE 提供给任何读取者。
你能要做的是创建一个命名管道。它存在于文件系统中,退出任何写入程序时都不会关闭。您甚至可以有多个写入器到管道,尽管我不建议这样做 - 您认为正在写入的“块”由于缓冲而被写入不同的块中。
您可以在已知目录中创建管道,mkfifo /path/to/pipe
然后根据您是读者还是写者将 stdin 或 stdout 重定向到该管道或从该管道重定向到该管道。
答案2
一旦管道关闭,就无法重新打开。我不知道文件系统上命名管道的所有细节,但如果你只是做类似的事情,cat somefile.txt | myprogram
那么一旦cat
关闭管道,管道就消失了。