UNIX 文化中有哪些元素?
如:用 TEX、nroff,不用 office;正則表達式;vi emacs。想知道更多......
居然沒人說留大鬍子。專門有一個詞叫"UNIX beard",還專門有個網站叫LinuxBeard.com
連O』Reilly都出了一本書,講如何長出合格的鬍子,用來應聘UNIX系統管理員(霧最後祭出神和教主的聖像鎮樓。
我印象中的UNIX文化主要是
- 多用戶分時共用一台主機的文化:UNIX發明的年代計算機是如此昂貴,以至於唯一合理的利用方式就是多用戶分時共享一台機器。這就解釋了為什麼UNIX一開始就支持多進程、多用戶、用戶組和許可權管理。同時,還催生了一批允許同時登錄一台機器的用戶「單機聊天」的工具:write / talk / wall / mesg 以及後來的Telnet BBS
- 把文件操作利用到極致的文化:UNIX有極其豐富的文件操作API,還有mmap,因此允許用戶以最小的CPU/內存開銷管理極其複雜的文件。這樣導致的後果就是UNIX用戶不愛用傳統的資料庫技術來保存數據,而是更偏向於自己管理索引、玩手工優化到極致的「文件API雜技」。我印象中的Telnet BBS服務端軟體早期基本都是用文件系統而不是資料庫來持久化數據的
- 面向行的輸入、輸出格式:UNIX推崇在CLI Shell下通過管道組合多個進程協同完成工作,因此所有的程序都面臨如何在讀完標準輸入流之前(誰也不知道會有多長)就要幹活並輸出的問題。理論上需要實現一個狀態機來解析輸入流,實際上為了省事基本上所有的程序都是以行為基本分割符來切割數據;這樣做上遊程序也省事:面向行的輸出基本上都可以直接屏顯給用戶。因此,導致的後果是UNIX程序很少採用高度可靠的自分隔格式(如XML、JSON)作為標準輸出,而是靠用戶臨時用sed / awk這樣的工具來適配上下遊程序的行內格式,造成了無窮無盡的(微妙的)解析bug。這是UNIX風格最大的弊端之一
- 用純文本保存配置,文本編輯器直接修改(各種conf文件,Makefile等)
- 簡單的小工具通過組合完成複雜任務(sort, cut, uniq, tr等命令及管道)
- 多使用文件進行抽象(/dev下一大票, 進程間通信的socket,pipe文件等)
暫時想到這麼幾個,歡迎指正補充
o光從linux/posix API的角度講:
從C語言繼承來的實用主義色彩強烈,不追求理論和哲學上的美感,注重用起來的一時爽。比如ioctl一用就是幾十年,什麼東西都往一個int型的fd裡面裝,什麼錯誤都往全局變數寫,類型安全那都不是事。有人炮轟宏內核設計不夠優雅精美,linus則聲稱,現有的開發方式更為省心,至於一些隱含的指針和類型錯誤,反正排查的負擔沒超過一個閾值,不足為慮。
能用老框架伸縮一下接著用的,絕不改進新方法。比如說epoll/poll用了這麼多年,aio已經鴿掉。又比如進程間通信,大家寧可靠錘鍊tcp棧達到逼近memcpy的效果,也不去搞共享內存之類的花哨技法。
總體來說,我感覺UNIX系的哲學是「人類是愚蠢的,不如搞一坨簡單的土逼方法讓程序員去組合。」然後社區各自為陣,反覆重造輪子。windows的理念是」我們的架構是牛逼的,要搞一套巴洛克式的鴻篇巨著一統天下「,然後就大力出悲劇,萬年沒人用。(這裡指的是公司忌憚於技術棧的強耦合,為了避免被微軟一家綁死,寧可使用次一等技術的現象)
體驗一下"CLI不是WYSIAYG"[1]的感覺:
下面一條命令讓ls輸出成json:
ls | perl -e "use JSON; @in=grep(s/
$//, &<&>); print encode_json(@in)."
";"
---
[1]:WYSIAYG -- "What You See Is All You Got." By Brian W. Kernighan
大家都用字元串交流,但是每個人對escaping的具體做法各執一詞
拜C教
遞歸縮寫。
GNU is Not Unix
WINE is Not Emulator
點點點
小即使美, 小比「對」更重要, 這點很像病毒。
觀點來自&kiss,pipe,一切皆文件
我以為,對於 zhihu 最重要的一點就是「問問題的藝術」。這是 unix 傳統文化中非常重要的一點。
比如,自己沒有調查研究問題之前,不要嘗試去問問題。
比如,問題的措辭要清楚明白,語言通順,符合邏輯。
比如,不要使用讓人不舒服的語言,不要顯得粗魯或愚蠢。
等等等等。。。
一次只做一件事情,並把它做好。其他的,浮雲了
可以讀讀《UNIX編程藝術》,書中詳細介紹了UNIX系統的設計哲學、思想文化,以及設計編程時的一些原則和經驗。
最喜歡Unix設計哲學裡的一句話拿不準就窮舉
導致我做題有時拿不準先打個表 打個表再說
#!/usr/bin/banner
1. Makefail
2. GNU is Not 滾.
3. usr is Not user.
4. Yet Another YA??. (?可為任意字母)
5. source.tar (20KB)
- main.cpp (1KB)
- LICENCE (19KB)
- README (0KB)
6. Breakdown Again Shell
7. Release makes everyone Tense.
8. 如有雷同,他fork我的。
一切都是文件
純粹,簡約!!
KISS
sendmail
基於命令行/文本的程序界面+管道,催生了一系列各司其職,把單一功能做到極致的小工具,這些小工具藉助前面的機制粘合起來可以完成很多複雜的工作。
推薦閱讀: