對於Pipe管道之愛 - jessfraz

banq發表於2019-01-23

我最常用的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

相關文章