2.16 即使在将输出用作输入时也要保存输出副本

2.16 Saving a Copy of Output Even While Using It as Input

问题

您想调试一长串管道输入输出,例如:

如何在不破坏管道的情况下看到 uniq 和 awk 之间发生了什么?

解决办法

解决这些问题的方法是,在管道中使用管道工所称的“T 形接头”法。对于 bash 来说,意思是使用 tee 命令将输出拆分为两个相同的流,一个写入文件,另一个写入标准输出,以便继续沿管道发送数据。

对于这个例子来说,我们想要在一长串管道字符串中调试,那就在 uniq 和 awk 中插入 tee 命令:

讨论

tee 命令把输出写入参数指定的文件中,同时把相同的输出写入标准输出。在我们的例子中即送了一份副本到 /tmp/x.x 中,同时也把相同数据送到了 awk,也就是通过管道符号连接到 tee 输出之后的那个命令。

其实不必关心这些例子中命令行的每个不同的部分正在做什么;我们只需要关注如何在命令序列中使用 tee 即可。

让我们来简单回顾一下,从稍微简单一些的命令行开始。假设你只想保存一个长时间运行命令的输出以供后续使用,同时也能在屏幕上看到该输出。可以这样做:

这个命令可以找到许多 C 源文件,所以输出很可能会发生滚屏。使用 more 或 less 会让输出分成许多可以操控的分段,但是内容一经输出,你就无法在不重新运行命令的情况下回看输出结果。所以,你可以在运行命令的同时把结果保存到一个文件:

但是,你得等这条命令运行完毕才能看到文件的内容。(好吧,我们知道有 tail -f 命令,但这超出了本文的讨论范围。)tee 命令可以用于代替简单地将标准输出重定向:

在这个例子中,由于 tee 的输出不再重定向了,所以 tee 将会把结果输出到屏幕。但是还会把分流的副本写入文件,以供以后使用(例如,cat /tmp/all.my.sources)。

也要注意到,在上述例子中,我们完全没有重定向标准错误。这意味着遇到任何错误,比如 find 命令中遇到的错误,都将会打印在屏幕上,且不会出现在 tee 文件中。我们可以在 find 命令后添加 “2>&1″:

把错误输出包含在 tee 文件中。虽然输出没有被整齐地分开,但至少全部被捕获了。

参见

  • man tee
  • 18.5 参数重用
  • 19.13 调试脚本

关于 “2.16 即使在将输出用作输入时也要保存输出副本” 的 2 个意见

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据