我們傳統的寫程式辦法是造單一而功能全面的程式,設法在乙個程式裡提供能夠全面滿足需求的功能,這樣的做法會造成程式龐大而複雜,可維護性降低。
windows
上的程式通常如此,具有全面的功能,基本上不考慮與其他程式的配合,比方說有兩個程式都需要分頁,他們會各自開發乙個分頁模組,而不是去尋求共用分頁功能。在
unix
世界裡的做法與之相反,每個程式只做單一的功能,除此之外不做任何多餘的事情。複雜的功能通過多個程式之間配合完成(通過管道)。相信經常使用
unix
命令列工具的人會經常為它的強大和靈活而感到深深的震撼和佩服。舉個例子:
乙個檔案裡存有很多
url,每行乙個
url,其中不少
url是重複出現的(比如某**的
access log
,有些url
被多次訪問)。如何從中提取出前
10名訪問最多的
url?
$ sort access.log | uniq -c | sort -rn | head
第乙個sort
負責排序,把相同的
url都聚在一起;
uniq -c
計算出每個
url的出現次數,並把出現次數的值附加在每個
url前面;第二個
sort
按每個url
出現的次數從高到底排序;
head
取其中的前10個
url。
這是一次完美而漂亮的配合。每個命令都各司其職,做好自己的事,但每個命令對整體要做的事情都一無所知,它們知道的是一些資料進來,處理之,然後把一些資料輸出去。這些命令組合在一起,就完成了你想要完成的功能。
shell
命令的組合可以做的事情數不勝數,再舉幾個例子:
檢視當前檔案系統的磁碟空間主要耗費在**?
$ du --max-depth=4 /home|sort -nr |more
根據正規表示式去
kill
特定的程序:
$ ps xww | grep "sleep" | cut -c1-5 | xargs -i kill {} 2>/dev/null
乙個可以即時編譯執行的
c程式:
$ echo 'main() ' | gcc -w -x c -; ./a.out
等等。。。
很多事情在其他作業系統上完成比較笨拙或困難,要麼不得不自己程式設計去做,要麼求助於專門工具。而在
unix
系列作業系統上僅僅輕敲幾個命令就可以搞定,這也是
unix/linux
深受喜歡的原因之一。
那麼,這樣的威力和靈活性從**來?
1
,每個命令只做一件事,相當於提供了基本功能;
2,提供了靈活的組合手段,通過管道配合來組合各個命令的功能完成整件事情。
這些程式可以無縫地配合的原因是,所有命令共同遵守統一的輸入輸出表示(對於每個命令程式來說,輸入的內容都是以換行符分隔的文字,工作方式都是一行一行的處理,輸出時同樣是以換行符分隔的文字,這就確保了輸出的結果可以作為遵守同樣約定的程式的輸入,從而提供了無縫的組合手段)。這樣的方式同樣也提供了擴充套件的能力,在特定的情況下,如果現有的命令仍然不夠用,你很容易新增新的命令,只要你編寫的程式遵守同樣的約定,就可以與現有的
unix
命令完美配合。
按照語言的三要素來說(基本要素,組合手段,抽象手段),
unix
命令列至少提供了其中兩個要素(基本要素,組合手段)。因此它可以靈活的完成很多任務作。ps:
統一的表示威力是強大的。
在
lisp
語言中,一切資料都是
list
,甚至lisp
**本身也表示為乙個
list
。lisp
提供了內建的對
list
的操作,其強大和靈活使
lisp
風靡半世紀而不衰(包括
lisp
的後繼scheme
和common lisp
)。據說六七十年代有一門深受程式設計師喜愛的語言,名叫
apl,在這門語言裡所有的資料都是陣列,而且為各種型別的通用陣列操作提供了一套統一而方便的運算子。
UNIX命令列基礎(二)
昨日補充 ls aa 展示當前路徑下aa資料夾裡面的內容 stdio.h 與的區別 是先從自己建立的工程中找庫函式讀取標頭檔案,而 則是先從系統庫中讀取。pwd 用來顯示使用者當前所在路徑 位置 cp 拷貝 要時刻注意當前的位置 cp old file new file 在同一路徑下的拷貝如果名字相...
Byobu 命令列終端的強大利器
my heart is in the work!於是乎搜尋幾款linux下的分屏軟體screen tmux byobu,關於他們的區別,我想這個byobu開發者之一的回答解釋的很明確。鏈結 簡單的說,screen是一種用於保持終端可持續會話 可以同時進行多個會話的乙個工具。而byobu呢,則是ubu...
UNIX命令列快速入門5
檔案系統安全 訪問許可權 在乙個目錄中輸入 ls s 會輸出很多有關目錄的內容細節 每乙個檔案和目錄都有相關的訪問許可權,可以看出是什麼使用者什麼組擁有這個檔案。最左邊一列由十個字元組成,由d,r,w,x,還有s或者 s組成的,如果開頭是 d的話就代表是乙個目錄,開頭是 的話就代表是字串的開始。其餘...