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
我发现了一个旧的 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