指令詳解:文件操作、權(quán)限管理與效率提升)
說實(shí)話每次有人問我“Linux該從哪學(xué)起”我的回答都特別一致先把基礎(chǔ)指令打扎實(shí)。很多新手一上來就奔著“Linux內(nèi)核源碼分析”“嵌入式驅(qū)動(dòng)開發(fā)”去結(jié)果連ls的參數(shù)都沒記全寫個(gè)腳本還要現(xiàn)查cp的用法這種狀態(tài)去碰系統(tǒng)底層純屬給自己找罪受。這篇《Linux基礎(chǔ)指令介紹·上》就是給準(zhǔn)備入坑的開發(fā)者、運(yùn)維、測(cè)試和嵌入式方向的同學(xué)準(zhǔn)備的。不用管你以后是寫后端、調(diào)服務(wù)器還是搞單片機(jī)交叉編譯這些指令都是繞不開的第一道門檻。這篇我會(huì)先把文件目錄操作、文件內(nèi)容查看、權(quán)限管理和幾個(gè)能顯著提升效率的小習(xí)慣講透更進(jìn)階的進(jìn)程管理、網(wǎng)絡(luò)配置、文本處理三劍客留到下一篇再聊。1. 先搞明白為什么Linux基礎(chǔ)指令值得認(rèn)真學(xué)1.1 圖形界面能搞定的事為什么還要敲命令很多剛接觸Linux的人都有個(gè)疑問桌面上點(diǎn)來點(diǎn)去不也能操作文件嗎為什么非得讓我背命令道理其實(shí)很簡(jiǎn)單。你平時(shí)自己電腦上用的Ubuntu桌面版、Deepin這些確實(shí)有圖形界面可一旦到了服務(wù)器環(huán)境情況完全變了。我最早實(shí)習(xí)的時(shí)候公司分給我一臺(tái)云服務(wù)器SSH連上去就是一坨黑底白字的終端沒有桌面連個(gè)圖標(biāo)都看不到。生產(chǎn)環(huán)境為了穩(wěn)定和省資源絕大多數(shù)都沒有圖形界面你唯一的操作入口就是命令行。這個(gè)場(chǎng)景從云服務(wù)器、物理機(jī)到嵌入式開發(fā)板全是同一個(gè)邏輯。更進(jìn)一步說命令行的價(jià)值在于可組合、可自動(dòng)化。你在圖形界面里復(fù)制十個(gè)文件得點(diǎn)十次鼠標(biāo)但寫成一行for i in {1..10}; do cp a.txt file_$i.txt; done一條命令就搞定了。你在圖形界面里沒法做的事——比如命令執(zhí)行完自動(dòng)發(fā)封郵件通知你、檢查日志文件有沒有新增錯(cuò)誤、每天凌晨三點(diǎn)自動(dòng)備份數(shù)據(jù)庫——這些全部依賴命令行。圖形界面像開車掛了個(gè)自動(dòng)擋省心但精細(xì)控制有限命令行像手動(dòng)擋雖然入門要費(fèi)點(diǎn)心思但一旦熟練那種“把機(jī)器安排得明明白白”的感覺確實(shí)很爽。1.2 理解Linux的目錄邏輯一切從根開始學(xué)基礎(chǔ)指令之前得先建立Linux的目錄觀。Linux的目錄結(jié)構(gòu)跟Windows那種C盤D盤完全不一樣它是一棵倒掛的樹最頂端是根目錄/所有目錄和文件都掛在它下面。先記住這幾個(gè)關(guān)鍵位置的用途后面操作會(huì)很順手/根目錄一切從這里開始/etc系統(tǒng)配置文件的家比如網(wǎng)絡(luò)配置、軟件源列表都在這里/var動(dòng)態(tài)數(shù)據(jù)日志文件在/var/log下/home普通用戶的家目錄對(duì)應(yīng)每個(gè)用戶的個(gè)人文件/tmp臨時(shí)文件目錄重啟一般會(huì)被清空/bin和/sbin系統(tǒng)命令存放位置ls、cp都在這類目錄里還有一個(gè)新手容易懵的點(diǎn)Windows用反斜杠\分隔路徑Linux用正斜杠/。這個(gè)習(xí)慣越早改越好不然你在鍵盤上找半天反斜杠系統(tǒng)只會(huì)回你一句“No such file or directory”。另外Linux下的路徑分絕對(duì)路徑和相對(duì)路徑。絕對(duì)路徑從根目錄寫起例如/home/test/temp/file.txt相對(duì)路徑從當(dāng)前目錄出發(fā)例如./temp/file.txt或者../temp/file.txt。..表示上一級(jí)目錄.表示當(dāng)前目錄這兩個(gè)符號(hào)在后續(xù)操作里會(huì)反復(fù)用到。2. 文件與目錄操作最常用的一組基礎(chǔ)指令2.1 先學(xué)會(huì)不迷路pwd、ls、cd 的組合用法在任何系統(tǒng)里你首先得知道自己在哪、周圍有什么然后才能去別的地方。對(duì)應(yīng)到Linux就是三個(gè)基礎(chǔ)指令pwd、ls、cd。pwdprint working directory用來打印當(dāng)前所在的工作目錄。我見過很多新手敲命令敲到一半突然找不到方向一個(gè)pwd就知道自己身處何方了這個(gè)命令不需要任何參數(shù)往回敲就對(duì)了。ls可能是你用得最多的命令。裸敲ls只會(huì)顯示文件名我強(qiáng)烈建議你直接養(yǎng)成用參數(shù)的習(xí)慣ls -l # 顯示詳細(xì)信息權(quán)限、屬主、大小、修改時(shí)間 ls -a # 顯示隱藏文件.開頭 ls -lh # 文件大小以人類可讀方式顯示K、M、G ls -lt # 按修改時(shí)間排序最新的在最上面ls -l的輸出信息量很大我逐個(gè)拆開講一下。比如這一行-rw-r--r-- 1 root root 4096 Mar 5 10:30 test.txt第一個(gè)字符-表示這是一個(gè)普通文件如果是d則是目錄后面的9個(gè)字符分成三組依次是屬主權(quán)限、屬組權(quán)限、其他人權(quán)限每組三個(gè)位置對(duì)應(yīng)r讀、w寫、x執(zhí)行沒有權(quán)限顯示-。再往后是硬鏈接數(shù)、屬主root、屬組root、大小4096字節(jié)、最后修改時(shí)間、文件名。這個(gè)格式后面講權(quán)限管理時(shí)還要細(xì)說這里先混個(gè)眼熟。cdchange directory用于切換目錄也有幾個(gè)高頻用法cd # 回到當(dāng)前用戶的家目錄等效 cd ~ cd /var/log # 絕對(duì)路徑跳轉(zhuǎn) cd ../ # 回到上一級(jí) cd - # 回到上一次所在的目錄來回切換特別好用這里必須強(qiáng)調(diào)**cd、ls、pwd這三個(gè)指令建議在一個(gè)終端里反復(fù)敲目錄切換的感覺找對(duì)了后面才能順**。我見過有人用cd去跳一個(gè)不存在的目錄系統(tǒng)報(bào)錯(cuò)后整個(gè)人懵住了其實(shí)錯(cuò)誤信息寫得清清楚楚這叫No such file or directory只是你還沒習(xí)慣看報(bào)錯(cuò)而已。2.2 創(chuàng)建與刪除mkdir、touch、rmdir、rm 的正確姿勢(shì)有瀏覽就必然有增刪。mkdirmake directory用于創(chuàng)建目錄mkdir mydir # 創(chuàng)建單級(jí)目錄 mkdir -p a/b/c/d # 遞歸創(chuàng)建多級(jí)目錄父目錄不存在時(shí)自動(dòng)創(chuàng)建 mkdir -m 755 mydir # 創(chuàng)建時(shí)直接指定權(quán)限-p這個(gè)參數(shù)我?guī)缀趺看尾渴痦?xiàng)目都會(huì)用到。比如你要?jiǎng)?chuàng)建/opt/app/logs如果/opt/app不存在不帶-p直接報(bào)錯(cuò)帶-p它會(huì)一路幫你把父目錄都建好。新手寫腳本時(shí)特別容易漏這個(gè)參數(shù)記住了能少踩很多坑。touch有兩個(gè)用途創(chuàng)建空文件或者更新已有文件的修改時(shí)間。你初始化項(xiàng)目時(shí)想快速生成一堆占位文件就可以touch README.md touch config.inirmdir只能刪除空目錄雞肋得很實(shí)際工作中大家基本都用rm -r。然后說到rm這個(gè)命令必須嚴(yán)肅對(duì)待。刪除單個(gè)文件用rm test.txt刪除目錄需要加-r參數(shù)表示遞歸順手配合-f可以強(qiáng)制刪除不提示force。于是江湖上流傳著一個(gè)著名的自殺式指令rm -rf /注意千萬別手滑。-rf加在/上就是刪根目錄輕則系統(tǒng)報(bào)廢重則把你運(yùn)行中的服務(wù)、數(shù)據(jù)庫文件全帶走。我見過不止一次群里有人發(fā)截圖問“不小心執(zhí)行了 rm -rf /usr 怎么辦”我只能回復(fù)“節(jié)哀重裝吧”。給你的建議是不要在關(guān)鍵目錄比如家目錄、/etc附近手滑尤其是用root賬戶操作時(shí)。如果你實(shí)在沒底可以先rm -i試試它會(huì)逐個(gè)文件確認(rèn)或者干脆把rm -i設(shè)成別名后面會(huì)講。還有一個(gè)思路值得學(xué)習(xí)生產(chǎn)服務(wù)器上不要直接刪數(shù)據(jù)先把要?jiǎng)h的文件移動(dòng)到 /tmp 目錄觀察一段時(shí)間沒問題再真正清理。用社區(qū)里流行的話說“刪除一時(shí)爽找回復(fù)原火葬場(chǎng)”多加一道“軟刪除”的工序保平安。2.3 移動(dòng)與復(fù)制cp、mv 的細(xì)節(jié)與坑文件要搬要拷就得靠cpcopy和mvmove。cp的基本用法cp source.txt dest.txt # 復(fù)制文件 cp -r dir1/ dir2/ # 遞歸復(fù)制整個(gè)目錄 cp -p file1 file2 # 保留原文件的屬性時(shí)間戳、權(quán)限等 cp -i file1 file2 # 覆蓋前詢問建議加上 cp -v file1 file2 # 顯示復(fù)制過程verbose模式-r這個(gè)參數(shù)我?guī)缀蹩梢詳嘌悦總€(gè)新手都漏過一次。復(fù)制目錄不加-r系統(tǒng)直接報(bào)omitting directory意思是你忽略了一個(gè)目錄。這個(gè)報(bào)錯(cuò)英文看起來挺復(fù)雜實(shí)際上就是告訴你“兄弟這是目錄得加 -r 才行”。mv的用法相對(duì)優(yōu)雅它既能移動(dòng)文件也能重命名mv old.txt new.txt # 重命名 mv file.txt /tmp/ # 移動(dòng)到其他目錄 mv -i source dest # 覆蓋前詢問mv有一個(gè)隱藏細(xì)節(jié)如果目標(biāo)路徑在同一個(gè)文件系統(tǒng)內(nèi)mv實(shí)際上是一次“改名字”操作瞬間完成如果跨文件系統(tǒng)比如從/tmp移動(dòng)到掛載的另一塊磁盤系統(tǒng)會(huì)先復(fù)制再刪除速度會(huì)明顯變慢。理解了這一點(diǎn)你就不會(huì)奇怪為什么在服務(wù)器上移動(dòng)一個(gè)大目錄等了半天還沒結(jié)束。實(shí)際工作中還有一個(gè)常見需求批量重命名文件?;A(chǔ)指令階段先不用學(xué)rename但你可以用簡(jiǎn)單的for循環(huán)加mv實(shí)現(xiàn)。比如給當(dāng)前目錄下所有.txt文件加個(gè)backup_前綴for f in *.txt; do mv $f backup_$f; done這一行能跑通你對(duì)變量的理解就已經(jīng)入門了。3. 查看文件內(nèi)容從 cat 到 grep 的管道思維3.1 cat、less、head、tail按需看文件文件創(chuàng)建好了接下來就是怎么讀。很多人跟我說“Linux下打開文件好麻煩”其實(shí)是你沒選對(duì)工具。cat是最直覺的命令把整個(gè)文件內(nèi)容一次性輸出到終端cat file.txt cat -n file.txt # 顯示行號(hào)cat適合小文件幾十行以內(nèi)的配置看一下很舒服。但如果文件有幾萬行你就別用cat了終端會(huì)被刷得密密麻麻想找一行內(nèi)容簡(jiǎn)直大海撈針。這時(shí)候用lessless large.logless是個(gè)交互式翻頁工具進(jìn)入之后按空格翻下一頁按b翻上一頁按/關(guān)鍵詞搜索按q退出。它不會(huì)一次性把整個(gè)文件塞進(jìn)內(nèi)存所以打開幾百M(fèi)B的日志文件也扛得住。我排查線上問題時(shí)終端不變的配置永遠(yuǎn)是tail -f加less雙打的。head和tail分別看文件開頭和結(jié)尾head -n 20 file.txt # 看前20行 tail -n 50 file.txt # 看最后50行 tail -f app.log # 實(shí)時(shí)跟蹤文件新增內(nèi)容按 CtrlC 退出tail -f是運(yùn)維排查最常用的命令沒有之一。你可以在一個(gè)終端里開著它另一個(gè)終端去操作服務(wù)每次日志文件有新行寫入它立刻顯示出來。調(diào)試web程序、看應(yīng)用啟動(dòng)日志它都是標(biāo)配工具。個(gè)人經(jīng)驗(yàn)凡是“為什么我的服務(wù)沒反應(yīng)”這種問題第一件事就是tail -f盯日志比瞎猜強(qiáng)一百倍。3.2 grep 與管道讓指令學(xué)會(huì)協(xié)作如果說有一組技能讓Linux命令行從“普通”變成“強(qiáng)大”那一定是管道和grep。grep的功能是在文件或文本中搜索匹配的內(nèi)容grep error app.log # 在日志中搜包含error的行 grep -i error app.log # 忽略大小寫 grep -n error app.log # 顯示行號(hào) grep -v DEBUG app.log # 排除包含DEBUG的行 grep -r TODO ./src/ # 遞歸搜索目錄下所有文件而管道符|的作用是把左邊命令的輸出作為右邊命令的輸入。不用背概念看例子就懂了ls -l /etc | grep conf # 找出 /etc 下名字里帶conf的文件 history | grep vim # 在歷史記錄里找之前敲過的vim命令 cat app.log | grep ERROR | tail -n 20 # 看最后20條錯(cuò)誤管道的哲學(xué)就在于組合。單看grep、tail、cat每個(gè)都不起眼但把它們串起來就能完成類似“從100萬行日志里找最近5條報(bào)錯(cuò)”這種高級(jí)操作。這個(gè)“小工具組合成大能力”的設(shè)計(jì)思想其實(shí)與樂高積木很像——單個(gè)模塊能力有限但標(biāo)準(zhǔn)的接口讓它們能無限拼接。我們團(tuán)隊(duì)有個(gè)新人兄弟剛開始不習(xí)慣管道總問我“有沒有一個(gè)工具能把日志過濾完再顯示最后幾條”我告訴他“不需要新工具現(xiàn)有工具串聯(lián)一下就有了”。這就是Linux的魅力命令不是功能孤島而是可以自由組合的積木。3.3 wc、sort、uniq幾行命令完成文本統(tǒng)計(jì)這部分算是“小驚喜”讓你看到命令行做統(tǒng)計(jì)也能很順手。wcword count統(tǒng)計(jì)行數(shù)、單詞數(shù)、字節(jié)數(shù)wc -l file.txt # 統(tǒng)計(jì)行數(shù) wc -w file.txt # 統(tǒng)計(jì)單詞數(shù)sort對(duì)文本行排序uniq去除連續(xù)重復(fù)的行。注意uniq只能去重相鄰的重復(fù)行所以通常要配合sort先把重復(fù)行歸到一起sort access.log | uniq -c | sort -rn這行命令的含義是把訪問日志排序統(tǒng)計(jì)每個(gè)IP出現(xiàn)的次數(shù)然后按出現(xiàn)次數(shù)降序排列。它是我做訪問統(tǒng)計(jì)時(shí)的最愛一條命令就能讀出訪問量Top的IP。拆開來看sort access.log # 按字典序排序 uniq -c # 連續(xù)重復(fù)行合并并加上出現(xiàn)次數(shù) sort -rn # 按第一列數(shù)字次數(shù)反向排序-n是數(shù)字序-r是降序?qū)嶋H效果類似這樣256 192.168.1.100 189 192.168.1.200 45 10.0.0.15這種“文本處理三兄弟”組合在日志分析場(chǎng)場(chǎng)景里出鏡率極高。你現(xiàn)在不用背參數(shù)表只要記住“排序、去重、計(jì)數(shù)”這三步套路后面遇到“統(tǒng)計(jì)XX次數(shù)”的需求就能自然想到。4. 用戶、權(quán)限與系統(tǒng)信息理解Linux的安全模型4.1 用戶身份whoami、id、su、sudo 的區(qū)別Linux是個(gè)多用戶系統(tǒng)所以你在里面敲命令時(shí)始終要明白“我是誰”。whoami直接告訴你當(dāng)前用戶名非常簡(jiǎn)單$ whoami aliceid給的信息更全展示UID、GID和所屬組$ id uid1000(alice) gid1000(alice) groups1000(alice),4(adm),27(sudo)然后就是兩個(gè)經(jīng)常被搞混的命令su和sudo。su是switch user意思是完全切換用戶。su - root會(huì)切換成root用戶并加載root的環(huán)境變量。但你要知道使用su切換到root需要輸入root的密碼這在生產(chǎn)環(huán)境基本上要禁止沒有人會(huì)把root密碼隨意公開。sudo是superuser do意思是以另一個(gè)用戶身份執(zhí)行單條命令。日常用得最多的是臨時(shí)提權(quán)sudo apt update sudo systemctl restart nginx執(zhí)行時(shí)只需輸入當(dāng)前用戶自己的密碼驗(yàn)證通過之后在緩存時(shí)間內(nèi)不需要重復(fù)輸入。更重要的是**sudo可以細(xì)分授權(quán)**——管理員可以在/etc/sudoers里指定某個(gè)用戶只能執(zhí)行哪些命令例如只允許restart特定服務(wù)其他命令無權(quán)執(zhí)行。所以一個(gè)穩(wěn)妥的方針是日常用普通用戶需要提權(quán)時(shí)用 sudo而不是長期開著 root 終端。我見過不少新手全程root操作一個(gè)誤敲rm -rf就真的后悔莫及。如果出現(xiàn)alice is not in the sudoers file的報(bào)錯(cuò)說明這個(gè)用戶沒有sudo權(quán)限要找管理員把它加進(jìn)sudo組或者在/etc/sudoers里配置。不要試圖自己vim /etc/sudoers亂改語法錯(cuò)了所有用戶都提不了權(quán)那就真的叫“自己把自己鎖在門外了”。4.2 權(quán)限管理的核心chmod 與 chownLinux的權(quán)限模型初學(xué)者總覺得抽象其實(shí)就三個(gè)角色屬主、屬組、其他人乘三種權(quán)限讀、寫、執(zhí)行。前面ls -l看到的-rw-r--r--就是權(quán)限的編碼。chmod用來修改權(quán)限推薦掌握數(shù)字表示法。規(guī)則很簡(jiǎn)單r讀 4w寫 2x執(zhí)行 1把三者相加就得到一個(gè)數(shù)字例如7 rwx5 r-x4 r--6 rw-。然后用三個(gè)數(shù)字分別表示屬主、屬組、其他人chmod 755 script.sh # 屬主rwx屬組r-x其他人r-x chmod 644 config.txt # 屬主rw-屬組r--其他人r--實(shí)際場(chǎng)景非常典型腳本文件要能執(zhí)行就得有x權(quán)限。新手寫了個(gè).sh腳本執(zhí)行時(shí)報(bào)Permission denied基本都是因?yàn)闆]加執(zhí)行權(quán)限chmod x script.sh ./script.sh還有一個(gè)高頻組合chmod 600 id_rsa # SSH私鑰只允許屬主讀寫密鑰文件權(quán)限過寬會(huì)被拒絕連接如果SSH連服務(wù)器發(fā)現(xiàn)Permissions 0644 for id_rsa are too open就說明你把私鑰權(quán)限設(shè)太寬了改成chmod 600立刻就好。chown修改文件屬主和屬組chown alice file.txt # 修改屬主為alice chown alice:developers file.txt # 同時(shí)修改屬主和屬組 chown -R alice:developers /opt/app/ # 遞歸修改目錄下所有內(nèi)容最常見的場(chǎng)景是部署應(yīng)用時(shí)把項(xiàng)目目錄歸屬給運(yùn)行該服務(wù)的用戶。比如Nginx默認(rèn)以www-data用戶運(yùn)行如果你上傳的文件屬主是root那么Nginx可能沒權(quán)限讀取——這時(shí)候一條chown -R www-data:www-data /var/www/html就能解決問題。說到底權(quán)限問題八成都是在告訴你“當(dāng)前用戶對(duì)某個(gè)文件沒有相應(yīng)權(quán)限”??炊畧?bào)錯(cuò)比記住參數(shù)表更重要Permission denied就一個(gè)字一個(gè)字地看它會(huì)告訴你缺的是讀、寫還是執(zhí)行。4.3 系統(tǒng)狀態(tài)查看df、free、uname學(xué)指令的過程中偶爾也要抬頭看看“這臺(tái)機(jī)器整體啥情況”。幾個(gè)零基礎(chǔ)也能快速上手的狀態(tài)指令df -h # 查看磁盤使用情況-h 以人類可讀格式顯示 free -h # 查看內(nèi)存使用情況 uname -a # 查看內(nèi)核版本和系統(tǒng)架構(gòu) date # 查看系統(tǒng)時(shí)間 uptime # 查看系統(tǒng)運(yùn)行時(shí)長和負(fù)載df -h輸出里重點(diǎn)關(guān)注根分區(qū)的Use%如果跑到90%以上系統(tǒng)可能開始出現(xiàn)日志寫不進(jìn)去、服務(wù)啟動(dòng)失敗等各種詭異問題。清理磁盤時(shí)常用的一招就是結(jié)合du找大目錄du -sh /var/log/* | sort -hr | head -10這條命令的意思是列出/var/log下每個(gè)目錄的大小按大小降序取前10個(gè)。磁盤滿了的時(shí)候這是我第一個(gè)會(huì)執(zhí)行的命令。free -h要注意Linux的內(nèi)存設(shè)計(jì)free顯示的值很小不代表真的不夠用因?yàn)長inux會(huì)把空閑內(nèi)存用作緩存。判斷內(nèi)存是否吃緊主要看available一列它才是真正可分配給新進(jìn)程的內(nèi)存量。這幾條命令不常用但關(guān)鍵時(shí)刻救命。系統(tǒng)卡出毛病時(shí)它們就是你的體溫計(jì)和血壓計(jì)。5. 提升效率的習(xí)慣tab補(bǔ)全、歷史記錄與重定向5.1 tab補(bǔ)全與通配符不再打錯(cuò)命令名說實(shí)話如果只讓我提一個(gè)“指數(shù)級(jí)提升效率”的習(xí)慣那必須是tab補(bǔ)全。Linux終端里輸入命令、文件名、目錄名的前幾個(gè)字符按一下Tab鍵系統(tǒng)會(huì)自動(dòng)補(bǔ)全。如果有多條匹配按兩下直接列出所有可選內(nèi)容。這個(gè)動(dòng)作看著不起眼實(shí)際用起來體驗(yàn)是天壤之別一個(gè)長路徑名手動(dòng)敲既慢又容易錯(cuò)但用tab補(bǔ)全幾乎不可能輸錯(cuò)。我見過很多人還在慢吞吞敲完整路徑真的替他們的時(shí)間心疼。通配符則是另一種“自動(dòng)批量選擇”常用三個(gè)*匹配任意字符例如*.log匹配所有以.log結(jié)尾的文件?匹配單個(gè)字符例如file?.txt匹配 file1.txt、file2.txt[abc]匹配括號(hào)內(nèi)任一字符例如file[12].txt匹配 file1.txt 或 file2.txt舉個(gè)例子想刪除所有.tmp結(jié)尾的臨時(shí)文件rm *.tmp想列出名字是access_log、error_log兩個(gè)文件ls *_log通配符跟其他命令配合起來會(huì)讓批量操作變得非常順手。但注意通配符會(huì)先展開再執(zhí)行所以rm *這種操作要格外小心它會(huì)匹配到當(dāng)前目錄所有非隱藏文件一旦敲下去又沒加-i覆水難收。5.2 history 與 alias把敲過的命令變成資產(chǎn)你有沒有過這種經(jīng)歷昨天明明敲過一條很復(fù)雜的命令今天想再敲一次結(jié)果怎么都想不起來了。這時(shí)候history就派上用場(chǎng)了。history # 列出本次登錄執(zhí)行過的所有命令 history | grep docker # 篩出和docker相關(guān)的歷史命令更高效的是按CtrlR進(jìn)入反向搜索模式輸入關(guān)鍵詞終端會(huì)幫你自動(dòng)匹配最近的匹配項(xiàng)再按一下繼續(xù)往前翻。這是我一天按幾十次的高頻操作強(qiáng)烈推薦養(yǎng)成本能。!系列也有小用處!! # 執(zhí)行上一條命令 !ls # 執(zhí)行最近一條以ls開頭的命令比如你剛執(zhí)行一條命令發(fā)現(xiàn)權(quán)限不夠可以sudo !!直接以sudo身份重跑上一條不用重打一遍。這種“小聰明”在服務(wù)器上排查問題時(shí)特別提氣。alias用來定義自己的快捷命令。作為普通人我建議新人在家目錄下的~/.bashrc里加上兩個(gè)保命別名alias llls -lh alias rmrm -i第一條讓ll成為詳細(xì)信息列表的快捷方式第二條強(qiáng)制rm在刪除前確認(rèn)。修改完別忘source ~/.bashrc或者重開一個(gè)終端讓它生效。我給所有新人的口頭禪都是“先給 rm 上個(gè)保險(xiǎn)再談效率。”5.3 重定向指令的輸出可以“接力”默認(rèn)情況下命令的輸出顯示在終端上但有時(shí)我們需要把它存到文件里或者把錯(cuò)誤信息和正常信息分開這就用到重定向。三種最常用形式echo hello output.txt # 覆蓋寫入文件不存在則創(chuàng)建 echo world output.txt # 追加寫入不覆蓋原內(nèi)容 ls -l 2 error.log # 2 表示只保存錯(cuò)誤輸出/dev/null是個(gè)特殊的“黑洞設(shè)備”寫入它的內(nèi)容會(huì)直接消失常用于丟棄不需要的輸出ls -l /nonexistent 2/dev/null # 錯(cuò)誤信息不顯示一個(gè)經(jīng)典的需求把命令的標(biāo)準(zhǔn)輸出和錯(cuò)誤輸出分別存到不同文件./script.sh stdout.log 2 stderr.log如果希望把正常輸出和錯(cuò)誤都匯總到一個(gè)文件./script.sh all.log 21這幾個(gè)符號(hào)別死記用幾次就懂了。我跑定時(shí)任務(wù)腳本時(shí)最常干的事就是把腳本輸出重定向到日志文件里——這樣即使你退出了終端命令的結(jié)果也能被完整保留下來。6. 初學(xué)者最常踩的坑問題排查速查表學(xué)指令的過程必然伴隨著報(bào)錯(cuò)。與其怕報(bào)錯(cuò)不如學(xué)會(huì)站在報(bào)錯(cuò)信息的角度思考。下面是我這些年看到新人踩得最多的幾個(gè)坑整理成一張速查表報(bào)錯(cuò)現(xiàn)象可能原因解決辦法command not found命令不存在或不在當(dāng)前PATH路徑里檢查拼寫which 命令名看是否存在Permission denied權(quán)限不足或文件沒有執(zhí)行權(quán)限ls -l看權(quán)限需要時(shí)chmod x或加sudoNo such file or directory路徑寫錯(cuò)了文件/目錄不存在pwd確認(rèn)當(dāng)前目錄用絕對(duì)路徑或tab補(bǔ)全bash: ./script.sh: /bin/bash^M: bad interpreter腳本是Windows格式換行符不對(duì)用sed -i s/\r$// script.sh去掉CR字符rm: cannot remove xxx: Is a directory直接刪目錄但沒加-r改為rm -r或者用rmdir僅空目錄is not in the sudoers file當(dāng)前用戶沒有sudo權(quán)限用root執(zhí)行usermod -aG sudo username或聯(lián)系管理員排查的順序也有講究我自己的習(xí)慣是倒著看輸出先看最后一行報(bào)錯(cuò)搞清是哪條命令出的問題再看中間有沒有上下文信息。很多時(shí)候一行tail -n 5就能定位是哪一步出了問題。然后就是“命令工具”的驗(yàn)證鏈which 命令名 # 確認(rèn)命令是否在PATH里 type 命令名 # 查看命令類型內(nèi)置命令、別名還是外部程序 man 命令名 # 查看權(quán)威幫助文檔按q退出這里要特別提一下Windows下編輯腳本導(dǎo)致/bin/bash^M的問題。很多同學(xué)在Windows記事本里寫了.sh腳本傳到Linux一執(zhí)行就報(bào)錯(cuò)原因就是Windows的換行是\r\n而Linux只認(rèn)\n。解決辦法很簡(jiǎn)單執(zhí)行一次sed -i s/\r$// script.sh把多余的回車符去掉就行。這種事我?guī)缀趺總€(gè)季度都要幫人處理一次如果你用VS Code編輯也記得把右下角行尾序列改成LF。還有一個(gè)新手極容易忽視的“坑”不要在root下亂試不認(rèn)識(shí)的命令。你可能只是好奇敲了一條網(wǎng)上隨手抄來的“一鍵優(yōu)化”腳本結(jié)果它執(zhí)行了rm -rf系列操作系統(tǒng)當(dāng)場(chǎng)就廢了。在生產(chǎn)服務(wù)器上安全第一永遠(yuǎn)是鐵律。先在一個(gè)普通用戶環(huán)境里試試或者開個(gè)虛擬機(jī)隨便折騰都比直接拿生產(chǎn)環(huán)境當(dāng)實(shí)驗(yàn)田強(qiáng)。最后再分享一個(gè)老生常談但真的很有效的建議看完這些指令別急著關(guān)頁面打開終端把所有命令親手敲一遍。敲命令這件事手感和肌肉記憶比“眼睛看會(huì)了”有用得多。你可以開一臺(tái)虛擬機(jī)或者用云服務(wù)器把ls -l、cd /etc、grep -r這些操作從頭到尾過一遍親眼看一遍ls -l那串權(quán)限字符長什么樣親手制造一次Permission denied再去chmod x把它解決。這套基礎(chǔ)指令我在公司內(nèi)部帶新人時(shí)講過不下十遍每一次都有新手在實(shí)操中提出新問題。但萬變不離其宗——文件和目錄的操作是地基管道的組合思維是靈魂權(quán)限的理解是安全底線。把這三大塊吃透Linux的大門才算真正被你推開了一條縫。下一篇我會(huì)繼續(xù)講進(jìn)程管理、網(wǎng)絡(luò)配置和文本處理三劍客那些才是讓你從“會(huì)用”進(jìn)階到“能干活”的關(guān)鍵內(nèi)容。