本文編譯自commandlinefu.com ( 應該是 Catonmat ) 的系列文章 Top Ten One-Liners from CommandLineFu Explained 。做爲一個由用戶推薦最有用shell命令的網站,其記錄了數以萬計的各色shell命令,其中不乏至關實用和有趣的,本文就要細數當中獲投票最高的一些命令,從其中取材並加以細釋,但願讀者能從中受益。javascript
引言java
Shell做爲Unix系操做系統當中最有魅力且不可或缺的組件,通過數十載的洗禮不只沒有被淘汰,並且越發變得成熟穩健,究其緣由,大概由於它是個很是穩固的粘合劑,可以把大量功能強大的組件任意配搭,總能很好很快地完成用戶的任務。python
本文的一些命令極可能看起來是」雕蟲小技」,咱們只好仰慕一下Shell大牛了,可是有些細節我會稍加發掘加以說明,遇到有趣的地方但願能博您一笑了。shell
1.以SUDO運行上條命令編程
$ sudo !!
你們應該都知sudo,不解釋。但一般出現的狀況是,敲完命令執行後報錯才發現忘了sudo。這時候,新手用戶就會:按上箭頭,按左箭頭,盯着光標回到開始處,輸入sudo,回車;高手用戶就蛋定多了,按Ctrl-p,按Ctrl-a,輸入sudo,回車。vim
這裏介紹這個是天外飛仙級別的,對,就直接sudo !!。瀏覽器
固然這幾種解決方式效果是徹底同樣的,只是款不同,嗯,不解釋。bash
兩個感嘆號實際上是bash的一個特性,稱爲事件引用符(event designators)。!!其實至關於!-1,引用前一條命令,固然也能夠!-2,!-50。默認狀況下bash會在~/.bash_history文件內記錄用戶執行的最近500條命令,history命令能夠顯示這些命令。ssh
關於事件引用符的更多用法能夠深刻閱讀 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
6.快速備份一個文件
$ cp filename{,.bak}
這道命令把filename文件拷貝成filename.bak,你們應該在一些比較複雜的安裝教程裏面見過這樣的用法。其原理就在於bash對大括號的展開操做,filename{,.bak}這一段會被展開成filename filename.bak再傳給cp,因而就有了備份的命令了。
大括號在bash裏面是一個排列的意義,能夠試試這個:
$ echo {a,b,c}{a,b,c}{a,b,c}
將輸出三個集合的全排列:
aaa aab aac aba abb abc aca acb acc baa bab bac bba bbb bbc bca bcb bcc caa cab cac cba cbb cbc cca ccb ccc
關於shell當中的集合操做,可深刻閱讀」Set Operations in the Unix Shell」
7.免密碼SSH登陸主機
$ ssh-copy-id remote-machine
這個命令把當前用戶的公鑰串寫入到遠程主機的~/.ssh/authorized_keys內,這樣下次使用ssh登陸的時候,遠程主機就直接根據這串密鑰完成身份校驗,再也不詢問密碼了。前提是你當前用戶有生成了公鑰,默認是沒有的,先執行ssh-keygen試試吧!
這個命令若是用手工完成,是這樣的:
your-machine$ scp ~/.ssh/identity.pub remote-machine: your-machine$ ssh remote-machine remote-machine$ cat identity.pub >> ~/.ssh/authorized_keys
若是你想刪掉遠程主機上的密鑰,直接打開authorized_keys,搜索你的用戶名,刪除那行,便可。
8.抓取LINUX桌面的視頻
$ ffmpeg -f x11grab -s wxga -r 25 -i :0.0 -sameq /tmp/out.mpg
咱們在一些視頻網站上看到別人的3D桌面怎麼怎麼酷的視頻,一般就是這麼來的,ffmpeg能夠直接解碼X11的圖形,並轉換到相應輸出格式。
ffmpeg的一般用法是,根據一堆參數,輸出一個文件,輸出文件一般放最後,下面解析下幾個參數:
-f x11grab 指定輸入類型。由於x11的緩衝區不是普通的視頻文件能夠偵測格式,必須指定後ffmpeg才知道如何得到輸入。
-s wxga 設置抓取區域的大小。wxga是1366*768的標準說法,也能夠換成-s 800×600的寫法。
-r 25 設置幀率,即每秒抓取的畫面數。
-i :0.0 設置輸入源,本地X默認在0.0
-sameq 保持跟輸入流同樣的圖像質量,以用來後期處理。
至於其餘ffmpeg的用法,能夠參考下面兩篇文章:
後記
說Shell是一種編程語言,可能有些尷尬,雖然不少人天天都在用Shell,但歷來沒見它榮登TIOBE編程語言排行榜之類的,能夠說毫無名分,由於不少用戶沒意識到它是一種語言,只當作這是一個可以很好完成任務的工具,基本得理所固然,就好像GUI程序的菜單、按鈕同樣。
掌握Shell,一般可以讓任務在數秒鐘內完成,這就讓Shell跟C、Perl、Python這些語言區別開來,沒人否定後者更能勝任更多的任務,可是他們是在不一樣的層面上去作,Shell依賴大量的系統組件黏合調用,然後者依賴各類庫,各所擅長不一樣的應用領域,比喻就是,Shell是混凝土,能夠很方便地粘合一些建築組件而成爲穩固的高樓大廈;但一樣是粘合劑,粘玻璃窗、粘書報、粘皮鞋,混凝土是絕對不合適的,Shell並不擅長一些細緻操做,好比它連浮點運算都不支持,更別提什麼圖形運算什麼的。但這並不妨礙Shell來幫咱們完成不少粗重任務。
Shell的工做方式,大多數入門用戶會以爲枯燥難學,而所謂的經典教材也離不開《Advanced Bash-Scripting》、《Bash Guide for Beginners》,但相似本文這樣的一些」雕蟲小技」由於難登大雅之堂毫不會收錄進去。這狀況若是象國外一些unix用戶比較多的地方會有很好改善,即便是新手,偶爾看看別人的操做都能」偷師」一手,我編譯本系列文章其實也就但願稍微改善一下這個情況。