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 环境中,其中许多这样的管道同时运行,并且它们都不知道任何唯一值(它们只是处理数据流,不需要知道源,父脚本处理必要的分离)。这意味着使用临时文件也不实用,因为没有任何方法可以使文件名唯一。即使 $$ 似乎也没有给我每个步骤中相同的值。
您无法将管道设置为有条件的,因为命令是并行运行的。如果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)
| 归档时间: |
|
| 查看次数: |
371 次 |
| 最近记录: |