我正在运行一个 shell 脚本,它将数据从一个进程传输到另一个进程
process_a | process_b
Run Code Online (Sandbox Code Playgroud)
有谁知道一种方法来找出两个程序之间传递了多少字节?目前我能想到的唯一解决方案是编写一个小的 c 程序,从标准输入读取,写入标准输出并计算所有传输的数据,将计数存储在环境变量中,例如:
process_a | count_bytes | process_b
Run Code Online (Sandbox Code Playgroud)
有没有人有更简洁的解决方案?
Phi*_*l P 18
管道通过 dd。dd的默认输入是stdin,默认输出是stdout;当它完成 stdin/stdout I/O 时,它会向 stderr 报告它传输了多少数据。
如果您想捕获 dd 的输出并且其他程序已经与 stderr 对话,请使用另一个文件描述符。例如,
$ exec 4>~/fred
$ input-command | dd 2>&4 | output-command
$ exec 4>&-
Run Code Online (Sandbox Code Playgroud)
process_a | tee >(process_b) | wc --bytes
可能工作。然后,您可以将wc
的计数重定向到您需要的任何地方。如果process_b
向stdout
/输出任何内容,stderr
您可能需要将其重定向到某个地方,如果只是/dev/null
.
对于一个稍微做作的例子:
filestore:~# cat document.odt | tee >(dd of=/dev/null 2>/dev/null) | wc --bytes
4295
Run Code Online (Sandbox Code Playgroud)
通过解释:tee
让您将输出定向到多个文件(加上标准输出),并且>()
构造是 bash 的“进程替换”,在这种情况下,它使进程看起来像一个只写文件,因此您可以重定向到进程和文件(有关使用将输出发送到许多进程的示例,请参见此处,或此问题+答案tee
)。