linux 最强shell,最牛B 的 Linux Shell 命令(一)
引言
Shell作為Unix系操作系統(tǒng)當(dāng)中最有魅力且不可或缺的組件,經(jīng)過數(shù)十載的洗禮不僅沒有被淘汰,而且愈加變得成熟穩(wěn)健,究其原因,大概因?yàn)樗莻€(gè)非常穩(wěn)固的粘合劑,能夠把大量功能強(qiáng)大的組件任意配搭,總能很好很快地完成用戶的任務(wù)。
本文的一些命令很可能看起來是“雕蟲小技”,我們只好仰慕一下Shell大牛了,但是有些細(xì)節(jié)我會(huì)稍加發(fā)掘加以說明,遇到有趣的地方希望能博您一笑了。
1.以sudo運(yùn)行上條命令
$ sudo !!
大家應(yīng)該都知sudo,不解釋。但通常出現(xiàn)的情況是,敲完命令執(zhí)行后報(bào)錯(cuò)才發(fā)現(xiàn)忘了sudo。這時(shí)候,新手用戶就會(huì):按上箭頭,按左箭頭,盯著光標(biāo)回到開始處,輸入sudo,回車;高手用戶就蛋定多了,按Ctrl-p,按Ctrl-a,輸入sudo,回車。
這里介紹這個(gè)是天外飛仙級(jí)別的,對(duì),就直接sudo !!。
當(dāng)然這幾種解決方式效果是完全一樣的,只是款不一樣,嗯,不解釋。
兩個(gè)感嘆號(hào)其實(shí)是bash的一個(gè)特性,稱為事件引用符(event designators)。!!其實(shí)相當(dāng)于!-1,引用前一條命令,當(dāng)然也可以!-2,!-50。默認(rèn)情況下bash會(huì)在~/.bash_history 文件內(nèi)記錄用戶執(zhí)行的最近500條命令,history命令可以顯示這些命令。
關(guān)于事件引用符的更多用法可以深入閱讀The Definitive Guide to Bash Command Line History。
2.以HTTP方式共享當(dāng)前文件夾的文件
$ python -m SimpleHTTPServer
這命令啟動(dòng)了Python的SimpleHTTPServer模塊,考慮到Python在絕大多數(shù)的Linux發(fā)行版當(dāng)中都默認(rèn)安裝,所以這個(gè)命令很可能是最簡單的跨平臺(tái)傳文件的方法。
命令執(zhí)行后將在本機(jī)8000端口開放HTTP服務(wù),在其他能訪問本機(jī)的機(jī)器的瀏覽器打開ttp://ip:8000即打開一個(gè)目錄列表,點(diǎn)擊即可下載。
3.在以普通用戶打開的vim當(dāng)中保存一個(gè)root用戶文件
:w !sudo tee %
這題目讀起來糾結(jié),其實(shí)是很常見的,常常忘記了sudo就直接用vim編輯/etc內(nèi)的文件,(不過也不一定,vim發(fā)現(xiàn)保存的文件無法保存時(shí)候會(huì) 提示)等編輯好了,保存時(shí)候才發(fā)現(xiàn)沒權(quán)限。曲線方法是先保存?zhèn)€臨時(shí)文件,退出后再sudo cp回去。不過實(shí)際上在vim里面可以直接完成這個(gè)過程的,命令就是如此。
查閱vim的文檔(輸入:help :w),會(huì)提到命令:w!{cmd},讓vim執(zhí)行一個(gè)外部命令{cmd},然后把當(dāng)前緩沖區(qū)的內(nèi)容從stdin傳入。
tee是一個(gè)把stdin保存到文件的小工具。
而%,是vim當(dāng)中一個(gè)只讀寄存器的名字,總保存著當(dāng)前編輯文件的文件路徑。
所以執(zhí)行這個(gè)命令,就相當(dāng)于從vim外部修改了當(dāng)前編輯的文件,好完工。
4.切換回上一個(gè)目錄
$ cd -
應(yīng)該不少人都知道這個(gè),橫桿-代表上一個(gè)目錄的路徑。
實(shí)際上cd -就是cd $OLDPWD的簡寫,bash的固定變量$OLDPWD總保存著之前一個(gè)目錄的路徑。
相對(duì)地,$PWD總保存著當(dāng)前目錄的路徑。這些變量在編寫shell腳本時(shí)候相當(dāng)有用。
5.替換上一條命令中的一個(gè)短語
$ ^foo^bar^
又是另外一個(gè)事件引用符(event designator),可以把上一條命令當(dāng)中的foo替換成bar。
在需要重復(fù)運(yùn)行調(diào)試一道長長的命令,需要測試某個(gè)參數(shù)時(shí)候,用這個(gè)命令會(huì)比較實(shí)用;但多數(shù)人會(huì)首先選擇按上箭頭提出上道命令,再移動(dòng)光標(biāo)去修改某參數(shù),這樣更直觀,但效率上就不夠使用引用符高,而且在腳本中用這個(gè)方法可以簡化很多。
這道命令的原始樣式應(yīng)該是這樣的:
!!:s/foo/bar/
本文一開始介紹過!!,后面的一段大家應(yīng)該很熟悉,vim、sed的替換操作都是這樣的語法。
關(guān)于事件引用符的更多用法可以深入閱讀The Definitive Guide to Bash Command Line History
6.快速備份一個(gè)文件
$ cp filename{,.bak}
這道命令把filename文件拷貝成filename.bak,大家應(yīng)該在一些比較復(fù)雜的安裝教程里面見過這樣的用法。其原理就在于bash對(duì)大 括號(hào)的展開操作,filename{,.bak}這一段會(huì)被展開成filename filename.bak再傳給cp,于是就有了備份的命令了。
大括號(hào)在bash里面是一個(gè)排列的意義,可以試試這個(gè):
$ echo {a,b,c}{a,b,c}{a,b,c}
將輸出三個(gè)集合的全排列:
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
關(guān)于shell當(dāng)中的集合操作,可深入閱讀“Set Operations in the Unix Shell”
7.免密碼ssh登錄主機(jī)
$ ssh-copy-id remote-machine
這個(gè)命令把當(dāng)前用戶的公鑰串寫入到遠(yuǎn)程主機(jī)的~/.ssh/authorized_keys內(nèi),這樣下次使用ssh登錄的時(shí)候,遠(yuǎn)程主機(jī)就直接根據(jù)這串密鑰完成身份校驗(yàn),不再詢問密碼了。前提是你當(dāng)前用戶有生成了公鑰,默認(rèn)是沒有的,先執(zhí)行ssh-keygen試試吧!
這個(gè)命令如果用手工完成,是這樣的:
your-machine$ scp ~/.ssh/identity.pub remote-machine:
your-machine$ ssh remote-machine
remote-machine$ cat identity.pub >> ~/.ssh/authorized_keys
如果你想刪掉遠(yuǎn)程主機(jī)上的密鑰,直接打開authorized_keys,搜索你的用戶名,刪除那行,即可。
8.抓取Linux桌面的視頻
1
$ ffmpeg -f x11grab -s wxga -r 25 -i :0.0 -sameq /tmp/out.mpg
我們在一些視頻網(wǎng)站上看到別人的3D桌面怎么怎么酷的視頻,通常就是這么來的,ffmpeg可以直接解碼X11的圖形,并轉(zhuǎn)換到相應(yīng)輸出格式。
ffmpeg的通常用法是,根據(jù)一堆參數(shù),輸出一個(gè)文件,輸出文件通常放最后,下面解析下幾個(gè)參數(shù):
-f x11grab 指定輸入類型。因?yàn)閤11的緩沖區(qū)不是普通的視頻文件可以偵測格式,必須指定后ffmpeg才知道如何獲得輸入。
-s wxga 設(shè)置抓取區(qū)域的大小。wxga是1366*768的標(biāo)準(zhǔn)說法,也可以換成-s 800×600的寫法。
-r 25 設(shè)置幀率,即每秒抓取的畫面數(shù)。
-i :0.0 設(shè)置輸入源,本地X默認(rèn)在0.0
-sameq 保持跟輸入流一樣的圖像質(zhì)量,以用來后期處理。
后記
說Shell是一種編程語言,可能有些尷尬,雖然很多人每天都在用Shell,但從來沒見它榮登TIOBE編程語言排行榜之類的,可以 說毫無名分,因?yàn)楹芏嘤脩魶]意識(shí)到它是一種語言,只當(dāng)做這是一個(gè)能夠很好完成任務(wù)的工具,基本得理所當(dāng)然,就好像GUI程序的菜單、按鈕一樣。
掌握Shell,通常能夠讓任務(wù)在數(shù)秒鐘內(nèi)完成,這就讓Shell跟C、Perl、Python這些語言區(qū)別開來,沒人否認(rèn)后者更能勝任更多的任 務(wù),但是他們是在不同的層面上去做,Shell依賴大量的系統(tǒng)組件黏合調(diào)用,而后者依賴各種庫,各所擅長不同的應(yīng)用領(lǐng)域,比喻就是,Shell是混凝土, 可以很方便地粘合一些建筑組件而成為穩(wěn)固的高樓大廈;但同樣是粘合劑,粘玻璃窗、粘書報(bào)、粘皮鞋,混凝土是絕對(duì)不合適的,Shell并不擅長一些細(xì)致操 作,比如它連浮點(diǎn)運(yùn)算都不支持,更別提什么圖形運(yùn)算什么的。但這并不妨礙Shell來幫我們完成很多粗重任務(wù)。
Shell的工作方式,大多數(shù)入門用戶會(huì)覺得枯燥難學(xué),而所謂的經(jīng)典教材也離不開《Advanced Bash-Scripting》、《Bash Guide for Beginners》,但類似本文這樣的一些“雕蟲小技”因?yàn)殡y登大雅之堂絕不會(huì)收錄進(jìn)去。這情況如果象國外一些unix用戶比較多的地方會(huì)有很好改善, 即使是新手,偶爾看看別人的操作都能“偷師”一手,我編譯本系列文章其實(shí)也就希望稍微改善一下這個(gè)狀況。
總結(jié)
以上是生活随笔為你收集整理的linux 最强shell,最牛B 的 Linux Shell 命令(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 思路初探:采用c#实现pdf转ofd
- 下一篇: QT 调试