在
dd if=/dev/zero bs=1024K count=1 | nc -q 0 | grep copied
dd状态输出无法进入grep. grep正在读取nc的输出,而不是dd.如果dd在其stdout上写了那个输出,它会转到nc,而不是grep.
值得庆幸的是,dd不会将该状态消息写入其stdout(否则它将被发送到< IP_ADDR>我们不想要),但它会将其写入分离的流:stderr(因为它是诊断消息,不是它的正常输出).
要让dd的stderr连接到一个转到grep的管道(和nc的stdout stderr不变),你可以这样做:
{ {
dd if=/dev/zero bs=1M count=1 2>&3 3>&- |
nc -q 0 3>&-
} 3>&1 >&4 4>&- | grep copied 4>&-; } 4>&1
假设shell的stdin / stdout / stderr转到I,O,E(如果从终端运行,则所有将在读写模式下打开tty设备),在上面我们将:
cmd \ fd | stdin stdout stderr 3 4
---------+------------------------------------
dd | I pipe1 pipe2 closed closed
nc | pipe1 O E closed closed
grep | pipe2 O E closed closed
或者让dd的stderr和nc的stdout stderr转到grep(但是dd的stdout仍然转到nc):
{ </