Bash:使用命令替换的粘贴命令与 FIFO FD 之间的区别

Bash:使用命令替换的粘贴命令与 FIFO FD 之间的区别

我只是想了解为什么当我在粘贴命令中使用几个 FIFO FD 时会出现“管道损坏”的情况,但当我使用命令替换时一切都很好。

一点背景知识:我需要处理一个相当大的数组,寻找特定的值,最后完成用户可能想要的一系列任务。对于这个大数据集,速度非常重要。到目前为止,我想到的是简单地打印数组(并行下标和值,因为下标和值都将在用户任务中使用),将它们粘贴在一起,以便可以按顺序处理每个数组项“流”中的用户主要被管道接受(用户任务)。

但是,我发现粘贴命令的第一列(数组下标)没有成功。

这是一个非常简化的命令示例(create_tmp_fifo 的作用很简单,非常简单。管道中的“cat”只是用户任务的抽象示例):

fifo_pasteOutput=$(create_tmp_fifo) fifo_subscriptPrint=$(create_tmp_fifo) fifo_valuePrint=$(create_tmp_fifo);
printf '%s\n' "${!DATA_SET[@]}" >$fifo_subscriptPrint &
printf '%s\n' "${DATA_SET[@]}" >$fifo_valuePrint &
paste -d'|' <$fifo_subscriptPrint <$fifo_valuePrint | cat;
printf '\n';
rm $fifo_subscriptPrint $fifo_valuePrint $fifo_pasteOutput

输出:

[1] 117250
[2] 117251
#0,SYS[offset=0,ceiling=10]
#1,MSG[offset=11,ceiling=20]
#2,MISC[offset=21,ceiling=50]
[1]-  Broken pipe             printf '%s\n' "${!DATA_SET[@]}" > $fifo_subscriptPrint
[2]+  Done                    printf '%s\n' "${DATA_SET[@]}" > $fifo_valuePrint

为什么第一个进程显示“管道破损”?如果我做:

paste -d'|' <(printf '%s\n' "${!DATA_SET[@]}") <(printf '%s\n' "${DATA_SET[@]}")

一切都按预期进行。根据我对 Bash 手册的阅读,我了解到进程替换基本上与我对指定的 FIFO 文件执行的操作相同。我误解了什么吗?我很困惑。

避免在粘贴命令中使用进程替换将是首选,因为打印数组供用户使用的函数采用各种选项,以多种方式格式化输出,因此我试图减少每个不同变体的粘贴命令。

预先感谢您的任何见解

答案1

我觉得自己很蠢。已经找到答案了。

paste -d'|' $fifo_subscriptPrint $fifo_valuePrint

最后一次查看该命令,想知道它所采用的参数是否只是文件本身。不管怎样,谢谢大家的时间。

相关内容