Pipe stderr 和 stdout 分别在 bash/sh 中



我一直在尝试在我的服务器上使用以下命令 dd if=/dev/zero bs=1M count=1024 | md5sum

输出:

1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 2.92245 s, 367 MB/s
cd573cfaace07e7949bc0c46028904ff  -

如何让它仅将速度(367 MB/s)显示为输出?状态将打印到 stderr

我目前正在使用awk但它显示了 md5 哈希。

感谢帮助:)

首先,一个模拟命令的函数

simulation() { 
  echo "1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 2.92245 s, 367 MB/s" >&2
  echo "cd573cfaace07e7949bc0c46028904ff  -"
}
$ simulation >/dev/null
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 2.92245 s, 367 MB/s
$ simulation 2>/dev/null
cd573cfaace07e7949bc0c46028904ff  -

然后,解决方案:将 stderr 重定向到进程替换,该替换将所需的输出显示回 stderr,在变量中捕获 stdout。

$ md5sum=$( simulation 2> >(sed -n '/MB/s/ {s/.*, //p; q}' >&2) )
367 MB/s
$ echo $md5sum
cd573cfaace07e7949bc0c46028904ff -

最新更新