对于Pipe管道之爱 - jessfraz


我最常用的shell命令是"|"。这称为管道。
简而言之,"|"允许一个程序(左侧)的输出成为另一个程序的输入(在右侧)。这是一种将两个命令连接在一起的方法。
例如,如果我要运行以下内容:

echo "hello"

输出hello。

但如果我运行:
echo "hello" | figlet

这个figlet程序是改变了hello字符,看上去像卡通。

这是一种非常直率的描述某些东西的方式,在我看来,这是一种出色的软件设计,但我会在一秒钟之内学会。

让我们回到管道的起源。

根据doc.cat-v.org/unix/pipes/,管道的起源早在Unix之前就已存在。管道可以追溯到1964年Doug McIlroy的这篇笔记。

     - 10 -
    Summary--what's most important.

To put my strongest concerns into a nutshell:

1. We should have some ways of coupling programs like
garden hose--screw in another segment when it becomes when
it becomes necessary to massage data in another way.
This is the way of IO also.

2. Our loader should be able to do link-loading and
controlled establishment.

3. Our library filing scheme should allow for rather
general indexing, responsibility, generations, data path
switching.

4. It should be possible to get private system components
(all routines are system components) for buggering around with.

                                                M. D. McIlroy
                                                October 11, 1964 

Doug McIlroy将Unix哲学记录为:

  1. 让每个程序只做好一件事。要做新的任务,宁可重新构建而不是在旧程序上添加新的“功能”使旧程序复杂化。
  2. 期望每个程序的输出成为另一个尚未知的程序的输入。不要使用无关信息来混淆输出。避免严格的柱状或二进制输入格式。不要坚持互动输入。
  3. 设计和构建软件,甚至是操作系统,要及早尝试,最好在几周内完成。不要犹豫扔掉笨拙的部分并重建它们。
  4. 工具优先于不熟练的帮助,这样可减轻编程任务,即使你不得不绕道去构建工具(磨刀不误砍材工)。

我喜欢Unix的是“做好一件事”和“期望每个程序的输出成为另一个程序的输入”的理念。
这种理念建立在工具的使用上。这些工具可以单独使用,也可以组合使用以完成工作。这与用于解决特定问题的一切或一次性程序的单片程序形成鲜明对比。

我们在上面看到的echo默认将信息输出到终端。例如,cat将“连接”(它的同名)文件并将结果打印到终端。在Unix中阅读程序设计时,我意识到将工具的输出打印到用户终端实际上​​是特例。

当用户将cat通过“|”输出重定向到某个其他程序时, cat功能变得比原作者预想的要多得多。在我看来,这是最精彩的设计模式之一。

一方面,程序简单,做好一件事就可以轻松搞定。然而,美丽的部分是,与|程序这样的操作员相结合, 成为更大规划中的一步。原作者 cat甚至不需要了解什么更大的计划。这就是它的美妙之处在于“|”它可以通过将小而简单的程序组合在一起来解决问题。

我喜欢软件设计,它能够创造性,价值观简单,并且不会将用户放在盒子里。管道是保持程序简单同时实现可扩展性的关键元素。与"|"结合的简单程序变得远远超过原作者梦寐以求的程度。

我希望这篇文章可以帮助你学习一些东西,如果不是的话,只需要把它管道化到: /dev/null