引言
Shell作為Unix系操作系統當中最有魅力且不可或缺的組件,經過數十載的洗禮不僅沒有被淘汰,而且愈加變得成熟穩健,究其原因,大概因為它是個非常穩固的粘合劑,能夠把大量功能強大的組件任意配搭,總能很好很快地完成用戶的任務。
本文的一些命令很可能看起來是“雕蟲小技”,我們只好仰慕一下Shell大牛了,但是有些細節我會稍加發掘加以說明,遇到有趣的地方希望能博您一笑了。
1.以sudo運行上條命令
$ sudo !!
大家應該都知sudo,不解釋。但通常出現的情況是,敲完命令執行後報錯才發現忘了sudo。這時候,新手用戶就會:按上箭頭,按左箭頭,盯著光標回到開始處,輸入sudo,回車;高手用戶就蛋定多了,按Ctrl-p,按Ctrl-a,輸入sudo,回車。
這裡介紹這個是天外飛仙級別的,對,就直接sudo !!。
當然這幾種解決方式效果是完全一樣的,只是款不一樣,嗯,不解釋。
兩個感歎號其實是bash的一個特性,稱為事件引用符(event designators)。!!其實相當於!-1,引用前一條命令,當然也可以!-2,!-50。默認情況下bash會在~/.bash_history文件內記錄用戶執行的最近500條命令,history命令可以顯示這些命令。
關於事件引用符的更多用法可以深入閱讀The Definitive Guide to Bash Command Line History。
2.以HTTP方式共享當前文件夾的文件
$ python -m SimpleHTTPServer
這命令啟動了Python的SimpleHTTPServer模塊,考慮到Python在絕大多數的Linux發行版當中都默認安裝,所以這個命令很可能是最簡單的跨平台傳文件的方法。
命令執行後將在本機8000端口開放HTTP服務,在其他能訪問本機的機器的浏覽器打開ttp://ip:8000即打開一個目錄列表,點擊即可下載。
3.在以普通用戶打開的vim當中保存一個root用戶文件
:w !sudo tee %
這題目讀起來糾結,其實是很常見的,常常忘記了sudo就直接用vim編輯/etc內的文件,(不過也不一定,vim發現保存的文件無法保存時候會提示)等編輯好了,保存時候才發現沒權限。曲線方法是先保存個臨時文件,退出後再sudo cp回去。不過實際上在vim裡面可以直接完成這個過程的,命令就是如此。
查閱vim的文檔(輸入:help :w),會提到命令:w!{cmd},讓vim執行一個外部命令{cmd},然後把當前緩沖區的內容從stdin傳入。
tee是一個把stdin保存到文件的小工具。
而%,是vim當中一個只讀寄存器的名字,總保存著當前編輯文件的文件路徑。
所以執行這個命令,就相當於從vim外部修改了當前編輯的文件,好完工。
4.切換回上一個目錄
$ cd -
應該不少人都知道這個,橫桿-代表上一個目錄的路徑。
實際上cd -就是cd $OLDPWD的簡寫,bash的固定變量$OLDPWD總保存著之前一個目錄的路徑。
相對地,$PWD總保存著當前目錄的路徑。這些變量在編寫shell腳本時候相當有用。
5.替換上一條命令中的一個短語
$ ^foo^bar^
又是另外一個事件引用符(event designator),可以把上一條命令當中的foo替換成bar。
在需要重復運行調試一道長長的命令,需要測試某個參數時候,用這個命令會比較實用;但多數人會首先選擇按上箭頭提出上道命令,再移動光標去修改某參數,這樣更直觀,但效率上就不夠使用引用符高,而且在腳本中用這個方法可以簡化很多。
這道命令的原始樣式應該是這樣的:
!!:s/foo/bar/
本文一開始介紹過!!,後面的一段大家應該很熟悉,vim、sed的替換操作都是這樣的語法。
關於事件引用符的更多用法可以深入閱讀The Definitive Guide to Bash Command Line History