我只是想了解为什么当我在粘贴命令中使用几个 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
最后一次查看该命令,想知道它所采用的参数是否只是文件本身。不管怎样,谢谢大家的时间。