从 bash 进程替换中部分消耗,暂停它并在另一个函数中从中读取其余部分

Consuming partially from a bash process substitution, suspending it and reading the rest from it in another function

有没有办法只使用来自 Bash 进程替换的部分数据,暂停进程替换并在另一个函数中从中读取剩余数据。我想这样做而不将结果存储到中间文件中。我尝试了显而易见的方法:将进程替换存储在一个变量中并从中读取,但没有用。

我有一个进程生成的数据已经包含在进程替换中。假设它是 <(first_command)。我想在 function-1 中部分使用它,然后将其余数据(由 first_command 生成)传递给 function-2

如果您将命令的结果存储在一个变量中,它应该可以正常工作,但您需要通过两个函数解析整个数据:

data=$(first_command)
function-1 <(echo "$data")
function-2 <(echo "$data")

或者你可以像下面这样实现:

first_command | tee >(function-1 /dev/stdin) | function-2 /dev/stdin

我不知道你是否实现了这些功能,但如果它在你的控制之下,那么你可以简单地从标准输入读取而不必使用进程替换。但是,如果这些是 shell 函数,那么请记住,在这种情况下,您在子 shell 中是 运行 它们,并且您在其中更改的任何变量都将丢失。

如果你只想给 function-2 输出中 function-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.

中使用协同进程