使用bash进程替换的一部分,挂起它并在另一个函数中从中读取其余部分

使用bash进程替换的一部分,挂起它并在另一个函数中从中读取其余部分,bash,process-substitution,Bash,Process Substitution,是否有办法仅使用Bash进程替换中的一部分数据,挂起该进程替换,并在另一个函数中从中读取其余数据。我希望在不将结果存储到中间文件的情况下执行此操作。我尝试了显而易见的方法:将流程替换存储在一个变量中并从中读取,但这不起作用 我有一个生成数据的流程,该数据已经包装在流程替换中。假设它是如果您将命令的结果存储在变量中,它应该可以正常工作,但您需要通过两个函数解析整个数据: data=$(first_command) function-1 <(echo "$data") function-2 &

是否有办法仅使用Bash进程替换中的一部分数据,挂起该进程替换,并在另一个函数中从中读取其余数据。我希望在不将结果存储到中间文件的情况下执行此操作。我尝试了显而易见的方法:将流程替换存储在一个变量中并从中读取,但这不起作用


我有一个生成数据的流程,该数据已经包装在流程替换中。假设它是
如果您将命令的结果存储在变量中,它应该可以正常工作,但您需要通过两个函数解析整个数据:

data=$(first_command)
function-1 <(echo "$data")
function-2 <(echo "$data")
我不知道您是否正在实现这些函数,但是如果它在您的控制之下,那么您可以简单地从stdin读取,而不必使用进程替换。但是,如果这些是shell函数,那么请记住,在这种情况下,您在子shell中运行它们,并且您在其中更改的任何变量都将丢失

如果您只想给出
函数-2
输出中
函数-1
未处理的部分,我不知道如果这些函数不在您的控制之下,该怎么做。如果它确实是一个shell函数,那么您可以执行以下操作:

function-1() {
    while need_to_process_more; do
        read line
        ...
    done
    cat
}

function-2() {
    ...
}

...

first_command | function-1 | function-2

我将使用显式命名管道

mkfifo pipe
first_command > pipe &
function-1 pipe
function-2 pipe
rm pipe

您可能还可以在bash 4中使用协进程。

请给出一个示例,说明您的意思,因为我想不出有任何情况需要这样做。@User112638726我需要使用进程生成的流中的数据,但其中的不同部分需要由不同的函数处理。所以我希望这些函数接受一个句柄,消耗它需要消耗的字节数,然后将句柄传递给下一个函数。它也可能有助于在块中处理流。
function-2
需要处理补充部分,而不是
function-1
处理的部分。是的,这两个功能都在我的控制之下。真正的问题是
first_命令生成的数据非常庞大。我不可能把它存储在一个m/c的内存中。data=$(first_命令)是否会提取进程空间中的所有数据?这将是一个立即禁止。你的第二个建议看起来确实可行。在这种情况下,使用我提出的最后一个建议。除非您想将
function-1
的标准输出用于其他内容,否则它应该可以工作。这就是我一直在使用的。只是好奇为什么进程替换不起作用,因为它的语义是匿名命名管道的语义,正是因为它是匿名的。在创建替换时生成名称这一事实是一个实现细节;bash不保证该名称将在当前命令之外保持不变。
mkfifo pipe
first_command > pipe &
function-1 pipe
function-2 pipe
rm pipe