|
(高手們只要掌握不多的一些命令就可以從容完成許多復(fù)雜的任務(wù)) shell 編程的本質(zhì),就是將多步驟的復(fù)雜任務(wù)分解,然后使用流程控制語句將命令行串接起來,從而實(shí)現(xiàn)強(qiáng)大的自動(dòng)化處理。 Linux 還要用鼠標(biāo)嗎?https://www.toutiao.com/article/7184726094896038458/?log_from=4c999ea9ac0ed8_1672889779984 現(xiàn)在找互聯(lián)網(wǎng)行業(yè)的技術(shù)工作,有一項(xiàng)技能是必備的,那就是能熟練使用 Linux 操作系統(tǒng)。無論你是想做開發(fā)、測(cè)試、運(yùn)維,看看各大廠的要求吧,都要求會(huì) Linux。 Linux 并不容易上手,尤其是它的命令行(Command Line Interface, CLI)操作方式會(huì)讓初學(xué)者難以適應(yīng)。不過有句話說的是:GUI 使簡單的工作更簡單,而 CLI 使完成艱難的任務(wù)成為可能。 記得我剛?cè)胄袝r(shí),用 Linux 還在 GUI 界面下操作。結(jié)果有一回去跟一位技術(shù)大牛做對(duì)接就出糗了,我正到處尋摸鼠標(biāo),大牛一臉嫌棄地說:“Linux 還要用鼠標(biāo)嗎?” 大牛說著調(diào)出命令行界面,手指在鍵盤上一通飛舞,就把一個(gè)我認(rèn)為很困難的任務(wù)給快速搞定了。這是我對(duì)命令行的威力,第一次有直觀的感受。當(dāng)然,大牛的那句話我也一直記到現(xiàn)在。 命令行,就是 Linux 對(duì)外提供的人機(jī)操作接口。對(duì)于技術(shù)人來說,把操作命令行這門手藝修煉好,就可以將 Linux 的強(qiáng)大能力發(fā)揮出來。 進(jìn)入命令行世界的第一站,我們先了解一下命令行的哲學(xué)。 命令行哲學(xué):極致的藝術(shù)對(duì)于第一次打開 Linux 終端的初學(xué)者來說,最痛苦的有兩件事:第一是瞪著屏幕上閃爍的光標(biāo),總覺得這樣操作太低級(jí);第二是看著1000多個(gè)系統(tǒng)命令心發(fā)慌,這怎么學(xué)得完? 平心而論,學(xué)習(xí) Linux 命令行的門檻也就在這里,但為什么要這么設(shè)計(jì)呢?這就要從 Linux 操作系統(tǒng)的設(shè)計(jì)理念說起。 Linux 其實(shí)是一種類 Unix 操作系統(tǒng),而 Unix 是出自貝爾實(shí)驗(yàn)室的 Kenneth Thompson 之手。Thompson 大神在設(shè)計(jì) Unix 命令時(shí)化繁為簡,定下了一個(gè)基調(diào):一次只做一件事,做到極致。 ![]() Kenneth Thompson 這個(gè)意思就是某個(gè)命令行程序,它只完成一項(xiàng)任務(wù),并且把這項(xiàng)任務(wù)做到功能完備。例如 echo 就是回顯文本;cat 就是顯示文件內(nèi)容;ls 就是顯示磁盤目錄內(nèi)容。你要做什么,第一反應(yīng)就是這個(gè)程序,而不會(huì)想到別的。 當(dāng)我們理解了這個(gè)設(shè)計(jì)思想后,可能又會(huì)覺得這個(gè)道理太簡單了,好像天經(jīng)地義的一樣。但這也是經(jīng)歷了前人的失敗之后才總結(jié)出來的經(jīng)驗(yàn),大神不同于常人之處,就在于他能想到用最簡單的辦法去解決最復(fù)雜的問題。 所以,我們?cè)趯W(xué)習(xí) Linux 命令行時(shí),沒有必要去熟悉所有命令程序。只需要掌握好最常用的幾十個(gè)命令,并能根據(jù)任務(wù)要求去檢索一些特殊的命令進(jìn)行組合,這就能很好地完成工作了。 明白了道理,就要踏實(shí)做好實(shí)踐。為了打消你放棄的念頭,我們就從實(shí)例上手。 命令行初探:從入門到放心探索 Linux,最佳起點(diǎn)是學(xué)會(huì)操作文件系統(tǒng)。因?yàn)檫@包括如何切換目錄、查找文件、編輯文本、運(yùn)行可執(zhí)行程序等。在此我假設(shè)各位已經(jīng)安裝好了一個(gè) Linux 發(fā)行版,并且知道如何打開一個(gè)終端 Terminal 窗口。 終端窗口是與 Linux 的 shell 程序打交道,它會(huì)將用戶輸入的命令文本傳輸給 shell,然后 shell 會(huì)傳遞給 Linux 內(nèi)核去執(zhí)行,得到結(jié)果后再返回給終端窗口。 基本文件操作 掌握了這幾個(gè)命令,就可以對(duì) Linux 的樹形目錄組織結(jié)構(gòu)進(jìn)行游歷了。例如 /usr 目錄下都有哪些子目錄,每個(gè)子目錄中又有什么內(nèi)容。友情提示:不要在 root 權(quán)限下執(zhí)行 rm -rf /,不要執(zhí)行,不要執(zhí)行,因?yàn)檫@個(gè)事故責(zé)任我擔(dān)不起哈。 留一個(gè)思考題,如何在大量的文件中查找某個(gè)文件是否存在,例如在 /usr/bin 目錄下查找python程序。提示:可使用 find 命令。 神奇的管道 不知道你注意到?jīng)]有,單個(gè)命令只能完成一件事,那么復(fù)雜一點(diǎn)的需求怎么完成?答案是把命令行進(jìn)行組合,它依賴的技術(shù)就是管道。 這是 Thompson 大神的神來之筆,其實(shí)他當(dāng)年也受困于如何在程序之間傳遞數(shù)據(jù)的問題。后來有一天如同上帝親吻了他的腦門,他猛然悟道,于是只用了一個(gè)小時(shí)就在系統(tǒng)調(diào)用中實(shí)現(xiàn)了管道。這就是將程序的孤島給連接起來的豎線符:“|”。 用實(shí)例來感性體驗(yàn)一下,問:/usr/bin 目錄下總共有多少個(gè)文件?你還在一個(gè)一個(gè)數(shù)嗎,我的是 1060。下面就是我的方法: 這就是組合的威力,也是為什么高手們只要掌握不多的一些命令,就可以從容完成許多復(fù)雜的任務(wù)。當(dāng)然,這也需要不斷思考和練習(xí),逐步提升水平。如果上來就是大力出奇跡的蠻干,那只能在一個(gè)低水平里重復(fù)。 玩熟一個(gè)文本編輯器 在 Linux 下編輯文本是最常用操作,程序員寫代碼、測(cè)試寫腳本、運(yùn)維改配置,都繞不開這一步。我強(qiáng)烈建議大家不要只在 Windows 上編輯文件然后上傳,而要踏實(shí)掌握一個(gè)文本編輯器,例如 vim。 盡管 vim 有最難學(xué)會(huì)的編輯器稱號(hào),但掌握了它會(huì)有多爽真的只有自己才知道。關(guān)于學(xué)習(xí) vim 的建議我只有一個(gè),那就是運(yùn)行 vimtutor 命令,這是一個(gè)交互式的學(xué)習(xí)環(huán)境,輕松就助你掌握 vim。 ![]() 學(xué)習(xí)到這里還沒放棄,我想你應(yīng)該對(duì) Linux CLI 感到放心了,下面我們就更進(jìn)一步,走向?qū)I(yè)之路。 命令行進(jìn)階:shell 編程卓越的工程師都對(duì)效率有著偏執(zhí)的追求,他們無法忍受低效重復(fù)的工作,總要想盡辦法使之自動(dòng)化。Linux 下的 cron 這個(gè)定時(shí)自動(dòng)執(zhí)行命令,就是 Thompson 大神親手所寫。據(jù)說“cron”是他為了紀(jì)念希臘語的“時(shí)間”一詞。 可以說,shell 編程能力的高低,是專業(yè)和業(yè)余的分野。shell 編程的本質(zhì),就是將多步驟的復(fù)雜任務(wù)分解,然后使用流程控制語句將命令行串接起來,從而實(shí)現(xiàn)強(qiáng)大的自動(dòng)化處理。 shell 編程腳本語言提供的語法特性并不多,因?yàn)樗哪繕?biāo)本來就是助力自動(dòng)化,而不是成為一門特性完備的編程語言。簡單的語法有利于使用者快速掌握它,并形成生產(chǎn)力。 我們來思考一個(gè)稍有些難度的需求:創(chuàng)建 100 個(gè)文件,以 0 ~ 99 命名,文件名后綴為“txt”,并在每個(gè)文件內(nèi)寫入一個(gè)隨機(jī)數(shù)。 你打算用 vim 挨個(gè)創(chuàng)建并輸入?千萬不要這么干,下面給出一種解法: 將上述代碼保存至一個(gè)腳本文件,例如 genfiles.sh 中,修改文件屬性為可執(zhí)行,然后在終端中執(zhí)行./genfiles.sh命令,就可以進(jìn)行驗(yàn)證。 不要滿足于理解這個(gè)例子,結(jié)合工作中的實(shí)際需求,多做 shell 編程練習(xí),成為真正的 Linux 高手吧。 結(jié)語記得在工作多年之后,給新人培訓(xùn) Linux 操作時(shí),有位小伙子很殷勤地幫我把鼠標(biāo)遞過來,我下意識(shí)地就說了一句“Linux 還要用鼠標(biāo)嗎?” 說完這話我自己也覺得有意思,于是就跟他們分享了我當(dāng)初的那段經(jīng)歷。現(xiàn)在他們也成長起來了,不知道會(huì)不會(huì)把這個(gè)故事流傳給更多人。 現(xiàn)在 Linux 已經(jīng)是互聯(lián)網(wǎng)的基礎(chǔ)設(shè)施,對(duì)它的操作哪怕是生疏一些,都會(huì)在工作效率上被別人拉下一大截。所以技術(shù)人要在自己的技術(shù)棧中,將 Linux CLI 操作排在重要位置,多想多練。 最后,手邊常備《Linux 命令行大全 第2版》,你需要知道的命令行知識(shí)里面全都有。你能不能把操控命令行這門手藝,耍得風(fēng)生水起,就看你讀書是不是認(rèn)真啦。 ![]() |
|
|