天天看點

你可能不知道的Shell

shell也叫做指令行界面,它是*nix作業系統下使用者和計算機的互動界面。shell這個詞是指作業系統中提供通路核心服務的程式。

這篇文章向大家介紹shell一些非廣為人知、但卻實用有趣的知識,權當品嘗shell主食後的甜點吧。

shell幾乎是和unix作業系統一起誕生,第一個unix shell是肯·湯普遜(ken thompson)以multics上的shell為模範在1971年改寫而成,并命名thompson sh。即便是後來流行的bash(shell的一種變體),它的年齡實際上比目前流行的所有的linux kernel都大,可謂在linux系統上是先有shell再有kernel。

目前絕大部分*nix和macos作業系統裡的預設的shell都是bash,bash由brian fox在1987年創造,全稱bourne again shell ( bash)。

你可能不知道的Shell
你可能不知道的Shell

全球最大的源代碼倉庫github裡,shell的項目數占到了8%,跻身前5和java相當,可見在實戰工程裡,shell可謂寶刀不老。

你可能不知道的Shell

在閱讀以下部分前,強烈建議讀者打開一個shell實驗,這些都不是shell教科書裡的大路貨哦:)

<code>sudo !!</code>

以root的身份執行上一條指令 。

場景舉例:比如ubuntu裡用<code>apt-get</code>安裝軟體包的時候是需要root身份的,我們經常會忘記在<code>apt-get</code>前加<code>sudo</code>。每次不得不加上<code>sudo</code>再重新鍵入這行指令,這時可以很友善的用<code>sudo !!</code>完事。

<code>cd –</code>

回到上一次的目錄 。

場景舉例:目前目錄為<code>/home/a</code>,用<code>cd ../b</code>切換到<code>/home/b</code>。這時可以通過反複執行<code>cd –</code>指令在<code>/home/a</code>和<code>/home/b</code>之間來回友善的切換。

<code>^old^new</code>

替換前一條指令裡的部分字元串。

場景:<code>echo "wanderful"</code>,其實是想輸出<code>echo "wonderful"</code>。隻需要<code>^a^o</code>就行了,對很長的指令的錯誤拼寫有很大的幫助。

<code>man ascii</code>

顯示ascii碼表。

場景:忘記ascii碼表的時候還需要google麼?尤其在天朝網絡如此“順暢”的情況下,就更麻煩在gwf多應用一次規則了,直接用本地的<code>man ascii</code>吧。

<code>ctrl-x e</code>

快速啟動你的預設編輯器(由變量$editor設定)。

<code>netstat –tlnp</code>

列出本機程序監聽的端口号。

<code>tail -f /path/to/file.log | sed '/^finished: success$/ q'</code>

當file.log裡出現finished: success時候就退出tail,這個指令用于實時監控并過濾log是否出現了某條記錄。

<code>ssh user@server bash &lt; /path/to/local/script.sh</code>

在遠端機器上運作一段腳本。這條指令最大的好處就是不用把腳本拷到遠端機器上。

<code>screen -d -m -s some_name ping my_router</code>

背景運作一段不終止的程式,并可以随時檢視它的狀态。<code>-d -m</code>參數啟動“分離”模式,<code>-s</code>指定了一個session的辨別。可以通過<code>-r</code>指令來重新“挂載”一個辨別的session。更多細節請參考screen用法<code>man screen</code>。

下載下傳整個www.example.com網站。

<code>curl ifconfig.me</code>

當你的機器在内網的時候,可以通過這個指令檢視外網的ip。

<code>lsof –i</code>

實時檢視本機網絡服務的活動狀态。

<code>python -m simplehttpserver</code>

一句話實作一個http server,把目前目錄設為http服務目錄,可以通過<code>http://localhost:8000</code>通路 這也許是這個星球上最簡單的http伺服器的實作了。

最後來個複雜的——

<code>history | awk '{cmd[$2]++;count++;} end { for (a in cmd )print cmd[a] " " cmd[a]/count*100 "% " a }' | grep -v "./" | column -c3 -s " " -t | sort -nr | nl | head -n10</code>

最後還是那句shell的至理名言: 

“where there is a shell,there is a way!”
你可能不知道的Shell
你可能不知道的Shell

繼續閱讀