试图弄清楚如何让 shell 脚本只从stdin
. 我原以为这样的事情会奏效,但它没有:
#!/bin/bash
value=0
while [ "$value" != "-1" ]; do
read -r -d '' -n 20 value
if [ "$value" != "-1" ]; then
dd conv=notrunc status=none of=/path/bigfile.bin bs=1M count=1 seek=$value
fi
done
简而言之,我试图将特定块从大文件复制到远程位置的同一个文件。从发送脚本发送的数据有一个块位置(20 个字节),后跟要写入该位置的 1 MiB 数据。当位置为-1时完成。
如果运行已编译的 C 程序,我有一个可以正常工作的设置,但我想避免这种情况并使用本机 shell 命令运行。问题是,它似乎没有dd
消耗任何数据,所有这些都由read
命令处理。
可以stdin
被多个命令消费吗?
你可以用
dd
.这应该有效(
read ... value
变成value=$(dd bs=20 count=1 status=none)
):实际问题的答案是肯定的,您可以从
stdin
管道开始逐步阅读。脚本问题的解决方案是该
dd
命令没有消耗 1 MiB 的数据。写入dd
时将读取 65516 字节,即 65536 (64 KiB) 减去块大小的 20 字节。在读取了这个有限数量的数据后,dd
就会退出。解决方案是使用 flagiflag=fullblock
。此外,对 -1 的检查并不能像所写的那样工作。完整的功能解决方案是: