我已经尝试了大约一个小时来找到解决此问题的优雅方法。我的目标基本上是编写一个带宽控制管道命令,我可以在各种情况下重复使用它(不仅仅是网络传输,我知道 scp -l 1234)。我想做的是:
- 延迟
X
秒。 - 从管道读取
Y
数量(如果不够,则小于 Y)的数据。 - 将读取的数据写入标准输出。
地点:
X
可以是1..n
。Y
可以是 1 字节到某个高值。
我的问题是:
- 它必须支持 Bash 不能很好处理的二进制数据。
我走过或至少想到的道路:
- 使用
while read data
构造,它会过滤您使用的编码中的所有白色字符。 - 使用
dd bs=1 count=1
并循环。dd
似乎在if
中有内容时没有不同的退出代码。这使得更难知道何时停止循环。如果我将标准错误重定向到一个临时文件,此方法应该有效,读取它以检查是否传输了某些内容(因为它在 stderr 上打印的统计信息中)并重复。但我怀疑如果用于大量数据,它会非常慢,如果可能的话,我想跳过创建任何临时文件。
关于如何使用 Bash 尽可能干净地解决这个问题有什么想法或建议吗?
最佳答案
可能是pv -qL RATE?
-L RATE, --rate-limit RATE
Limit the transfer to a maximum of RATE bytes per second. A
suffix of "k", "m", "g", or "t" can be added to denote kilobytes
(*1024), megabytes, and so on.
关于linux - 从管道读取数据并写入标准输出,中间有延迟。也必须处理二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1463113/