對於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哲學記錄為:
- 讓每個程式只做好一件事。要做新的任務,寧可重新構建而不是在舊程式上新增新的“功能”使舊程式複雜化。
- 期望每個程式的輸出成為另一個尚未知的程式的輸入。不要使用無關資訊來混淆輸出。避免嚴格的柱狀或二進位制輸入格式。不要堅持互動輸入。
- 設計和構建軟體,甚至是作業系統,要及早嘗試,最好在幾周內完成。不要猶豫扔掉笨拙的部分並重建它們。
- 工具優先於不熟練的幫助,這樣可減輕程式設計任務,即使你不得不繞道去構建工具(磨刀不誤砍材工)。
我喜歡Unix的是“做好一件事”和“期望每個程式的輸出成為另一個程式的輸入”的理念。
這種理念建立在工具的使用上。這些工具可以單獨使用,也可以組合使用以完成工作。這與用於解決特定問題的一切或一次性程式的單片程式形成鮮明對比。
我們在上面看到的echo預設將資訊輸出到終端。例如,cat將“連線”(它的同名)檔案並將結果列印到終端。在Unix中閱讀程式設計時,我意識到將工具的輸出列印到使用者終端實際上是特例。
當使用者將cat透過“|”輸出重定向到某個其他程式時, cat功能變得比原作者預想的要多得多。在我看來,這是最精彩的設計模式之一。
一方面,程式簡單,做好一件事就可以輕鬆搞定。然而,美麗的部分是,與|程式這樣的操作員相結合, 成為更大規劃中的一步。原作者 cat甚至不需要了解什麼更大的計劃。這就是它的美妙之處在於“|”它可以透過將小而簡單的程式組合在一起來解決問題。
我喜歡軟體設計,它能夠創造性,價值觀簡單,並且不會將使用者放在盒子裡。管道是保持程式簡單同時實現可擴充套件性的關鍵元素。與"|"結合的簡單程式變得遠遠超過原作者夢寐以求的程度。
我希望這篇文章可以幫助你學習一些東西,如果不是的話,只需要把它管道化到: /dev/null
相關文章
- Swoole 原始碼分析——基礎模組之 Pipe 管道原始碼
- OpenCL中的管道cl::Pipe的使用
- linux程式間通訊--管道(PIPE & FIFO)Linux
- Linux 核心最新高危提權漏洞:髒管道 (Dirty Pipe)Linux
- 在Linux中,管道(pipe)和重定向(redirection)的是什麼?Linux
- Linux 之管道Linux
- Python並行程式設計(九):多程式物件交換之pipe(管道)實現生產者-消費者模型Python並行行程程式設計物件模型
- Python多程式之資料交換PipePython
- 效能優化之關於畫素管道及優化(二)優化
- [Bash] pipe intro
- Python多程式之Process、Pool、Lock、Queue、Event、Semaphore、PipePython
- Redis效能提高之批量和管道Redis
- linux 程式間通訊之管道Linux
- Redis學習之管道機制Redis
- [Python] pipe模組Python
- pipe stderr into another process
- 溫故之.NET程式間通訊——管道
- IceRPC之排程管道->快樂的RPCRPC
- Linux系統程式設計之匿名管道Linux程式設計
- 精讀《pipe operator for JavaScript》JavaScript
- 管道 |
- 老司機帶你實現 Laravel 之管道Laravel
- 程式設計優化之管道資料流程式設計優化
- angular 管道Angular
- 【linux】管道!!!Linux
- redis管道Redis
- Filter管道Filter
- Linux 管道Linux
- [Linux]管道Linux
- Pandas - pandas.Series.pipe 函式函式
- Oracle vs PostgreSQL Develop(19) - PIPE ROWOracleSQLdev
- 基於Apache Hudi和Debezium構建CDC入湖管道Apache
- 介紹 Linux 中的管道和命名管道Linux
- 演算法鏈與管道(上):建立管道演算法
- IceRPC之深入理解排程管道->快樂的RPCRPC
- .NET Core基礎篇之:白話管道中介軟體
- 速度不夠,管道來湊——Redis管道技術Redis
- 愛提問題是對的,但是……