bash脚本使用dd和重定向以块的形式处理stdin

bash脚本使用dd和重定向以块的形式处理stdin,bash,split,io-redirection,dd,Bash,Split,Io Redirection,Dd,我遇到了一个旧的bash脚本,它从stdin中分割数据。 当以seq 1234 |/test_dd_a.sh运行时,将创建临时1到临时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&qu

我遇到了一个旧的bash脚本,它从stdin中分割数据。
当以
seq 1234 |/test_dd_a.sh
运行时,将创建临时1到临时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
我想用它作为脚本的基础,该脚本将数据从stdin复制到stdout,类似下面的代码。但是,当以相同的方式运行时,它还没有向stdout提供任何输出,但它确实显示了进度,并在预期时停止

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或类似命令不可用。

FYI,
i=$(expr$i+1)
的运行速度比
i=$((i+1))
慢得多,而且基本上没有更大的可移植性(因为自从1992年最初发布POSIX.2以来,
$(())
被保证内置到所有符合POSIX的shell中)。顺便说一句,如果第一个scriptlet只查看由
dd
编写的部分是否为空,而不是试图解析其stderr,那么它对未记录行为的更改就不那么敏感了;这是否意味着只接受bash扩展?(限定上述声明之一:
dd
的stderr消息受文档保证的约束,但仅在
POSIX
区域设置中)。顺便说一句,请注意我的回答中的
0[+]0
,而不只是裸
[+]
,字符串
00
匹配,因为
+
是正则表达式语法中的修饰符。它不适用于我。没有任何内容指向标准输出。@basical,请在Nice one的在线解释器中查看当前版本的代码成功运行!非常感谢。
#!/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