bash 使用 dd 和重定向以块的形式处理标准输入的脚本

bash script to process stdin in chunks using dd and redirections

我发现了一个旧的 bash 脚本,它从标准输入中分离数据。
当 运行 为 seq 1234 | ./test_dd_a.sh 时,将创建文件 temp.1 到 temp.5。随着它的进展,它显示:

processing part 1
...
processing part 5
processing part 6
extraneous temp.6 will be deleted...

代码如下:

i=1
while true
do
    {
        echo "processing part $i" 1>&2
        dd bs=1k count=1 of="temp.$i" 2>&3
    } 3>&1 | grep -q '^0+0 ' && {
        echo "extraneous temp.$i will be deleted..."
        rm "temp.$i"
        break
    }
    i=`expr $i + 1`
done

我想将其用作将数据从标准输入复制到标准输出的脚本的基础,类似于下面的代码。然而,当 运行 以同样的方式它还没有向标准输出提供任何输出,但它确实显示进度并在预期时停止。

i=1
while true
do
    {
        echo "processing part $i" 1>&2
        dd bs=1k count=1  2>&3
    } 3>&1 | grep -q '^0+0 ' && {
        break
    }
    i=`expr $i + 1`
done

我希望通过最小的更改使上述工作正常,并且相信可以通过对重定向进行一些额外的修补来完成。 假设 pv、split 或类似命令不可用。

#!/usr/bin/env bash
i=1
while :; do
  echo "processing part $i" 1>&2
  if { LC_ALL=POSIX dd bs=1k count=1 2>&3 >&4; } 3>&1 | grep -qe '^0[+]0 '; then
    break
  fi
  i=$(( i + 1 ))
done 4>&1