管道中的条件步骤

Dav*_*ose 4 bash environment pipeline

给定一个类似于“A|B|C|D|E”的管道,我想让步骤 C 以步骤 B 的结果为条件。如下所示:

A | B | if [ $? -ne 0 ]; then C; else cat; fi | D | E
Run Code Online (Sandbox Code Playgroud)

但这似乎不起作用;无论 B 的结果如何,C 都不会被执行。我正在寻找更好的解决方案。

据我了解,管道的每个步骤都在其自己的子 shell 中运行。所以我无法将环境变量传递回管道。但这个管道处于 Gnu Parallel 环境中,其中许多这样的管道同时运行,并且它们都不知道任何唯一值(它们只是处理数据流,不需要知道源,父脚本处理必要的分离)。这意味着使用临时文件也不实用,因为没有任何方法可以使文件名唯一。即使 $$ 似乎也没有给我每个步骤中相同的值。

Joh*_*ica 5

您无法将管道设置为有条件的,因为命令是并行运行的。如果C直到B退出才运行,B那么 的输出将通过管道传送到哪里?

您需要将 的B输出存储在变量或临时文件中。例如:

out=$(mktemp)
trap 'rm "$out"' EXIT
if A | B > "$out"; then
    C < "$out"
else
    cat "$out"
fi | D | E
Run Code Online (Sandbox Code Playgroud)