[译]对管道(Pipes)的偏爱
文章目录
早上在hacker news上读到一篇短文,来自Jessie Frazelle的博客(Jessie Frazelle是Github团队成员).
文章写得简短清晰,顺手翻译过来。
译文
我最常用的shell命令是|
。它被称为管道(pipe)。
简而言之,|
允许一个程序(左侧)的输出成为另一个程序的输入(右侧)。这是一种将两个命令连接在一起的方法。
例如,如果我运行以下内容:
echo "hello"
输出为hello
但如果运行:
echo "hello" | figlet
figlet程序改变了hello中每个字母的外观,看起来像卡通风格。
|
|
这是一种非常直观的描述某些东西的方式。在我看来,这是一种优秀的软件设计。
让我们回到管道的起源。
根据doc.cat-v.org/unix/pipes/,管道早在Unix之前就已存在。管道可以追溯到1964年Doug McIlroy的这篇笔记:
|
|
Doug McIlroy将Unix哲学记录为:
- 让每个程序做好一件事。如果要完成一个新任务,重新构建而不是通过添加新的“功能”使旧程序复杂化。
- 期望每个程序的输出成为另一个尚未知的程序的输入。不要使用无关信息来污染输出。避免严格的柱状或二进制输入格式。别坚持使用互动输入。
- 设计和构建软件,甚至是操作系统,要尽早尝试,最好在几周内完成。毫不犹豫地扔掉笨拙的部分并重建它们。
- 使用工具让编程任务变轻松,即使你得先去构建这些工具,用完之后你还可能抛弃它。
来自贝尔系统技术期刊
我喜欢Unix的是“做好一件事”和“期望每个程序的输出成为另一个程序的输入”的理念。这种理念建立在工具的使用上。这些工具可以单独使用,也可以组合在一起使用以完成工作。这与用于解决特定问题的大一统/一次性的专用程序形成鲜明对比。
我们在上面看到的系统程序/命令:echo
默认将信息输出到终端。cat
将“连接”(它的同名)文件并将结果打印到终端。在阅读Unix程序设计时,我意识到将工具的输出打印到用户终端实际上是特例。
“也许令人惊讶的是,在实践中,事实证明特例是该程序的主要用途。”
当用户将cat
的输出通过|
重定向到其他程序时, cat
变得比原作者想要的更为强大。在我看来,这是最精彩的设计模式之一。一方面,程序变得十分简单,做好一件事的原则让它们轻易制作。更有趣的是,通过与|
操作符结合,程序成为更大规划中的一步。cat
的原作者甚至不需要了解更大的计划。这就是|
的美妙之处, 它可以通过将小而简单的程序组合在一起来解决问题.
我喜欢这样的软件设计,它鼓励创造,认可简单的价值,并且不会将用户放在盒子里。管道是保持程序简单同时实现可扩展性的关键元素。一个简单的程序通过与|
结合, 能力远远超出原作者梦寐以求的程度。
希望本文可以帮助你学习一些东西,如果它没做到,只需要把它pipe到/dev/null
。
译者注
如果你对管道有更多兴趣,推荐阅读《Unix编程艺术》
文章作者 种瓜
上次更新 2019-01-23