管道操作符把一个 UNIX? 命令连接到另一个命令,从而在命令行上创建专门的程序。但是,管道像是黑箱子,用户看不到从一个命令传递到下一个命令的数据。Pipe Viewer 可以探察管道。本文介绍如何在日常任务中使用它。
UNIX 中最巧妙最强大的功能之一是 shell。shell 比 GUI 高效得多,还可以通过编写脚本自动执行许多任务。更好的是,管道操作符可以在命令行上组装出专门的程序。管道按次序把命令连接起来,前一个命令的输出作为后一个命令的输入。
常用缩写词GUI:Graphical user interface
但是,管道有一个大缺点:它像是黑箱子。如果把命令连接在一起,那么只有序列中最后一个命令生成的输出能够反映管道的进度。当然,可以在序列中插入 tee,还可以用 tail 查看输出文件的增长,但是这些解决方案都不完善,会把多个阶段的标准输出 (stdout) 和标准错误 (stderr) 混在一起。另外,这两个解决方案比较粗糙,很可能无法表明每个步骤所需的计算量。
当然,可以把复杂的序列分解为多个单独的步骤,每个步骤有自己的中间输出文件。的确,如果希望检查每个步骤的结果,分解是最理想的方法。编写一个脚本,为每个步骤生成一个数据文件,在每对步骤之间使用数据文件作为输入,以最后的文件作为最终结果。但是,这种做法浪费了命令行的灵活性。
我们需要的是一个可以嵌入命令行中的进度度量工具。理想情况下,可以对每个步骤重复使用这个工具,它应该是开放源码的,可以移植到 Linux? 和 Mac OS X 等多种 UNIX 变体上。
好了,不必再盼望了:Pipe Viewer (pv) 就是这样的工具。它由系统管理员 Andrew Wood 编写,经过其他许多开发人员改进,前后历时四年。它提供了探察命令行管道的能力。它的 项目页面 上说,pv “可以插入管道中两个进程之间,从而显示传递数据的速度、已经花费的时间以及剩余时间。” 更引人注目的是,可以在同一个命令行中插入多个 pv 实例以显示相对吞吐量。
本文介绍如何在 UNIX 系统上构建 pv,以及如何在简单和复杂的命令行组合中应用它。但是,我们首先回顾一下管道连接进程的方式。