瑪利歐的水管 Pipe

傳說在機械化的黃金時代,流傳著一則故事︰

那時每一根小『螺絲釘』和小『螺絲帽』都是獨特的,不要說從這個工廠到那個工廠,就算在同一個工廠內,它們也都各有各的不同。只有那些沒有螺絲帽可以匹配的螺絲釘或沒有螺絲釘可以匹配的螺絲帽,才會被歸類成不好的。就這樣過了很多年,直到有一天艾索 ISO 出現了,推動『標準化』運動,自此一切都改變了 …。傳聞,最後一根獨特的小螺絲釘說︰『艾索,你這個老狐狸!…』。終究這些風塵往事早已被世人遺忘

無獨有偶 ── 發生過的事,總會再次發生 ──,其後,Douglas McIlroy 先生在寫命令列的外殼程式的時候,提出了管線 pipline 的概念,並用『 | 』符號代表。比如說『甲命令 | 乙命令』,講的是把甲命令的輸出結果當成乙命令的輸入來使用。之後於 1973 年 Ken Thompson 把它擴大為 『管子pipe 的標準,寫進了 Unix 作業系統,影響至今,於是開起了一個標準串流的時代。那什麼是標準串流呢?它就是之前在『除蟲!除錯?終端機。』一文中 IPO 模型抽象化後的相容性輸出入結構,應用於命令列的各個相容的指令的輸出入檔案 ── 當然也可以是裝置檔 ── 可串接性 chainable 的標準化。它定義了『標準輸入』stdin、『標準輸出』stdout、『標準錯誤』stderr,打開了程式間溝通的橋樑。舉例來說,假如 more 代表一頁一頁的讀,cat /boot/config.txt | more 就是一頁一頁的讀取樹莓派的開機組構檔 config.txt。自從有了管線之後,也就有一些命令因它而啟發

grep 是在標準輸入裡,尋找特定文本模式 text pattern 的程式,比方說 grep fsck 就是尋找文本裡有沒有 fsck 字串 ── 檔案系統檢查的總稱命令。

而前面說的 more,它的反義詞是 less 命令。

sed 是標準串流編輯程式,主要用來『過濾』── 只讓符合特定文本模式條件的內容通過串流;以及用來『轉換』── 在串流裡把「是這樣的」改寫成「是那樣的」。

……

更進一步就有了『導向』的想法。由於既然已有標準串流,又不區分什麼是裝置、什麼叫檔案?又有了標準化的輸出入;那又為什麼輸入總要來自『鍵盤』stdin、輸出也只能到『顯示器』stdout 呢?難道不能使用『檔案』當作來源處目的地嗎?而這個可以的回答,就是導向符號> 』和『 < 』的開始。比方說『 echo 字串 』這個命令,把該個字串輸出到螢幕上,那麽 『 echo 字串 > test.txt 』就把那個字串從頭蓋寫 ── 刪掉所寫檔案的內容,小心! ── 到一個叫 test.txt 的檔案裡。以下,你一試就能了解了︰

echo “This is a test.”
echo “This is a test.” > test.txt
cat test.txt | grep test

日後有人也許將再次發現把一些小程式 ── 容易寫、不容易寫錯 ── 串接起來,常常可以完成許多令人驚訝的事,這就是

Unix 的哲學上第一條所說的︰小即是美

無論人們所面對的『問題』是什麼?,『分割征服』的老方法依然有用 ── 古時所謂的大事化小、小事化無 ──。這在今天的『軟體工程學』上來說,也是如此。正由於標準化帶來了平凡與普通 ──  一說一般性,另說無差別, 正所以能建立軟體世界的溝通平台。這有什麼好處呢?因為過去軟體設計曾經是一門藝術,或者說屬於天生有才之輩,以致於難以學習模仿;然而到今了天之所以有工程學之實,其實是來自眾多前人的努力以及豐富的想像力。

這跟瑪利歐的水管有什麼關係?優尼克司的管子帶給人們思考的樂趣,而瑪利歐的水管則帶來了驚奇 ── 好玩就好