shell stdout 到两个命令并且程序被卡住

shell stdout 到两个命令并且程序被卡住

我有一个示例 shell 命令来计算数组百分位数

$ time zcat input.txt.gz | head -n 999999 | awk 'BEGIN{FS="\t"}{print $13}' | st
--percentile=97.5
75

real    0m3.532s
user    0m8.584s
sys     0m0.648s

你可以注意到它很快,因为我想用两个百分位数计算数字,我使用 tee 将 stdout 重定向到命令

mkfifo output_txt;
zcat input.txt.gz | head -n 999999 |
   awk 'BEGIN{FS="\t"}{print $13}' |
   tee >(st --percentile=2.5) >> output_txt |
   st --percentile=97.5 >> output_txt;
cat output_txt; rm output_txt

但这不是任何出局和卡住

我想我可能需要使用fifo,所以我改为

echo "" > output_txt;
zcat input.txt.gz | head -n 999999 |
   awk 'BEGIN{FS="\t"}{print $13}' |
   tee >(st --percentile=2.5) >> output_txt |
   st --percentile=97.5 >> output_txt;
cat output_txt; rm output_txt

它可以运行,但输出一长串数字,看起来该程序正在计算每行的分位数

input.txt可以生成

for ((i=0; i<999999; i++)); do
  number=$(awk 'BEGIN{print int(rand()*1000)/10}')
  echo $number >> input.txt
done

=====更新======

正如@ilkkachu 评论,以下命令可以很好地工作

echo "" > output_txt;
zcat input.txt | head -n 999999 |
   awk 'BEGIN{FS="\t"}{print $13}' |
   tee >(st --percentile=2.5 >> output_txt) |
   st --percentile=97.5 >> output_txt;
cat output_txt; rm output_txt

但使用fifo时不起作用(仍然卡住)

更新:@Paul_Pedant

FIFO 是一个管道。当它获取的数据达到某个系统限制(可能是 4096 字节(POSIX 最小值)或 64KB(典型 Linux)或其他限制)时,fifo 会阻塞写入,直到其他进程读取一些数据。

我认为这可以解释为什么在使用 fifo 时卡住

相关内容