本文共4300余字,預計閱讀時(shí)間15分鐘,本文同步發(fā)布于知乎(賬號silaoA)和微信公眾號平臺(賬號偽碼人)。
前一篇文章Cygwin系列(四):一步一步搭建Cygwin最小系統中已建立了最小系統環(huán)境,本篇將初步體驗Cygwin的Shell命令行。
利用setup安裝完最小系統后,桌面上建立了一個(gè)名為“Cygwin Terminal”的快捷方式。
雙擊運行,彈出一個(gè)黑框框,初次運行還會(huì )自動(dòng)幫用戶(hù)做一些配置工作,如建立用戶(hù)目錄等。最后,打印一個(gè)形式如“xxx@yyy ~ $”的提示符,緊跟著(zhù)是閃爍的光標,等待用戶(hù)輸入。如果直接按回車(chē),黑框框里就換行繼續打印出同樣的提示符,同樣跟著(zhù)是閃爍的光標,繼續等待用戶(hù)輸入。
那,可以做點(diǎn)什么呢?換句話(huà)說(shuō),我們能運行什么命令?先試試ls /,本人的輸出結果如下圖,注意到本人因做了額外配置,因此顯示內容、顏色與你的可能不同,注意“s”和“/”之間有空格隔開(kāi)。
再來(lái)解釋這個(gè)命令,ls是命令名稱(chēng),是list的簡(jiǎn)寫(xiě),用于列出指定路徑下的文件,而“/”就是指定的“路徑”。那么,“/”指的哪個(gè)路徑?如果稍稍留意輸出結果,可以推測出“/”就是指Cygwin安裝的頂層路徑。好像沒(méi)什么稀奇的,Windows下用Explorer也看看到指定路徑下的文件,而且更直觀(guān)。
不著(zhù)急,再繼續,試試help,輸出如下,結果比較長(cháng),截圖只有一部分。這個(gè)命令貌似是告訴用戶(hù)一些命令的用法。
初次體會(huì )到此結束,接下來(lái)并不想要你在黑框框里盲目亂敲,讓我們暫且開(kāi)啟高空俯視視角,避免迷失在暗黑森林。
好奇心驅使我去了解雙擊“Cygwin Terminal”快捷方式后,Windows幫我做了些什么。查看快捷方式的屬性,其中“目標”字段的值為“D:\Cygwin64\bin\mintty.exe -e /bin/bash –login -i”,從這里可以推斷,快捷方式實(shí)際運行的是mintty.exe,它就在Cygwin安裝目錄(D:\Cygwin64)的bin子目錄中,那么mintty是什么?后邊的“-e /bin/bash –login -i”又是什么意思?
查詢(xún)mintty官網(wǎng)上有文檔介紹,mintty是用于Cygwin、MSYS、Msys2等項目的“終端模擬器(Terminal Emulator)”,顧名思義,它就是用來(lái)模擬終端的,但是終端自身僅具有基本輸入輸出能力,并不會(huì )執行程序指令。
再接著(zhù)看,看到下面這張圖,mintty的help輸出中有一行“-e –exec Treat remaining arguments as the command to execute”,也就是“/bin/bash –login -i”是mintty啟動(dòng)后要執行的命令,這是要mintty啟動(dòng)bash.exe的節奏,還順帶傳遞了–login和-i選項,再一查“bash”,大名鼎鼎的Bourne Again Shell。再結合mintty的help輸出的頭兩行“Start a new session running the specified program or user’s shell”,也就是說(shuō)mintty啟動(dòng)的時(shí)候,會(huì )開(kāi)啟一個(gè)終端會(huì )話(huà)運行指定的程序或用戶(hù)Shell,上述“/bin/bash –login -i”正是“指定的程序”。 更多詳情,mintty官網(wǎng)給了詳細的手冊頁(yè)。
進(jìn)一步,打開(kāi)Windows任務(wù)管理器,看到一個(gè)“應用”Terminal和一個(gè)“后臺進(jìn)程”bash.exe,右鍵Terminal,轉到詳細信息,正是mintty.exe。程.png)
至此,可以初步確定,雙擊快捷方式實(shí)質(zhì)是啟動(dòng)了mintty,而mintty又啟動(dòng)了后臺進(jìn)程bash,我們看到的前臺窗口是mintty,而幕后則有bash在干活。
經(jīng)過(guò)一番操作(此處省略一萬(wàn)字……),了解到終端、終端模擬器、Shell的概念,可以總結如下:
①終端自身并不執行用戶(hù)輸入的命令,它只是負責把輸入的內容傳給系統,并把結果呈現在窗口上給用戶(hù)看;
②終端模擬器是一個(gè)模擬終端的圖形界面軟件,mintty就是一個(gè)終端模擬器實(shí)例;
③Shell是負責解釋執行用戶(hù)命令的解釋器,bash就是一個(gè)Shell實(shí)例,它是由mintty在后臺啟動(dòng)的。
從操作關(guān)系角度,可以簡(jiǎn)要繪制如下示意圖,其中Cygwin核心是更深層幕后工作者,為mintty、bash的運行提供環(huán)境支撐。
好了,現在理清楚了,在mintty輸入的內容實(shí)際都交給了Shell(bash)在處理,輸入的內容即為“命令”。俗話(huà)說(shuō)“沒(méi)有規矩不成方圓”,bash自有其一套語(yǔ)法規則,不合規則的輸入內容不能視作合法命令,Shell(bash)無(wú)法處理。
每條命令大體上遵循“<命令名稱(chēng)> <選項> <選項值> <參數>”的形式,命令名稱(chēng)(command)、選項(option)、選項值(value)、參數(argument)之間用空格隔開(kāi)。除了命令名稱(chēng),其他部分都不是必需的,比如在本文最開(kāi)頭執行的ls /,其中ls是命令名稱(chēng),/是參數,help就僅包含命令名稱(chēng),mintty --help只包含命令名稱(chēng)和選項,沒(méi)有選項值和參數。
計算機發(fā)明之初,存儲器是很稀有的資源,為了盡量減少存儲空間,也為了方便用戶(hù)記憶,命令名稱(chēng)都是單詞簡(jiǎn)寫(xiě),十分簡(jiǎn)潔,這個(gè)傳統基本上被保留下來(lái)。
命令名稱(chēng)描述要做什么(Do What),這個(gè)好理解,參數描述的是作用對象(to Whom),也比較好理解,而選項和選項值則具體描述怎么做(How to Do),這就比較復雜了。事實(shí)上,各個(gè)命令描述最多的地方就是選項和選項值。
選項有單個(gè)連字符(-)與字母組成的短選項風(fēng)格(UNIX風(fēng)格)和兩個(gè)連字符(–)與單詞組成的長(cháng)選項風(fēng)格(GNU風(fēng)格),很多命令兩者都支持,而且部分短選項和長(cháng)選項等效,還有少數命令支持“+”與字母組成的選項,甚至與這些風(fēng)格都不符的選項。
大部分命令都有“-v”和“-h”這兩個(gè)選項,或等價(jià)的“–version”和“–help”,用于顯示版本信息和幫助信息。熟悉應用程序,最主要地就是熟悉不同選項和不同參數配合作用,并加以掌握。對某個(gè)程序命令完全不了解或者是忘記了,都可以嘗試“-h”、“–help”、“-v”、“–version”選項去了解。
Shell能識別的命令大致分為3類(lèi):
①內建(built-in)命令,僅與Shell自身有關(guān),不同的Shell(如sh、bash、zsh、fish等)支持的內建命令;
②用戶(hù)定義函數(function)、別名(alias)等,用戶(hù)可自定義一些Shell函數,給命名設置別名等;
③外部命令,額外安裝的可執行程序越多,可供執行的外部命令就越多,比如ls就是外部命令。
要查詢(xún)某個(gè)命令屬于哪種,執行type -a <命令名稱(chēng)>即可;要看當前Shell支持哪些內建命令,執行help即可,其中type、help就是bash等Shell都會(huì )提供的內建命令。在剛安裝完Cygwin最小系統時(shí),bin子目錄下大量可執行文件,除去一些DLL文件,其余都是Shell外部命令。
文件都是存放在具體某個(gè)路徑下的,Shell在工作的時(shí)候也是處在某個(gè)路徑下,要查詢(xún)當前工作路徑(current working directory)是什么,可以通過(guò)內建命令pwd打印出來(lái),內建命令cd <路徑>可以切換工作路徑。
Shell剛啟動(dòng)的時(shí)候,默認切換到當前用戶(hù)目錄作為初始工作路徑,前文提到的提示符中,~就是當前用戶(hù)目錄,試下pwd如圖,結果為/home/<用戶(hù)名>。其中,home是Cygwin安裝目錄下的子目錄,<用戶(hù)名>是登錄當前Shell的賬號,在Cygwin中登錄當前Shell的賬號就是登錄到Windows系統的用戶(hù)名,這個(gè)子目錄是首次啟動(dòng)Shell時(shí)自動(dòng)建立的。
為什么要強調“當前”?因為UNIX/Linux是真正的多用戶(hù)系統,允許多個(gè)用戶(hù)同時(shí)登錄到系統中取得使用權,系統給每個(gè)用戶(hù)在/home目錄下建立各自的用戶(hù)目錄,這樣每個(gè)用戶(hù)的環(huán)境彼此隔離、互不干擾。Windows是號稱(chēng)多用戶(hù)系統,雖然也給每個(gè)用戶(hù)建立各自的用戶(hù)目錄,在C:\Users下,但是Windows一次只允許一個(gè)用戶(hù)登錄。
以上洋洋灑灑長(cháng)篇大論,除了開(kāi)頭演示ls /、help和中間穿插介紹的type、cd、pwd,就沒(méi)介紹幾個(gè)命令用法。本節也只打算介紹幾個(gè)關(guān)鍵命令,記住這幾個(gè),就可以去從零了解各個(gè)命令用法。
help是Shell內建命令,可以查看各個(gè)內建命令的用法。如果不帶參數,help輸出當前Shell支持的所有內建命令;如果帶參數,help <參數1> <參數2> ···則按參數逐個(gè)嘗試查找幫助主題,通常所有參數應當為內建命令或者能匹配內建命令的模式,比如h*匹配所有以h開(kāi)頭的內建命令:help、history。
對于絕大多數外部命令,都支持至少“-h”和“–help”選項之一,用于顯示該命令的用法,即使“-h”可能用作他途,但“–help”絕對是顯示用法。
也有少數命令不支持“-h”或“–help”選項,而是在沒(méi)有任何選項參數或者出錯的時(shí)候顯示用法。
man是POSIX規定的幫助手冊程序,是mannual的簡(jiǎn)寫(xiě)。軟件包中除了程序本身,還帶了大量用戶(hù)文檔,在UNIX/Linux系統中,手冊頁(yè)是最常見(jiàn)的用戶(hù)文檔之一,man手冊頁(yè)用特殊的格式寫(xiě)成并壓縮,通過(guò)man命令瀏覽。系統安裝的軟件包手冊頁(yè)通常在/usr/share/man/目錄之下,按照章節分門(mén)別類(lèi)地放在man1~man8子目錄中。
參照上面的說(shuō)明,試試man --help,如下圖man支持的選項很多,<章節>參數可以是1~8,指定man查找的章節。一般使用場(chǎng)景中不需要任何選項,直接man <主題>即可,man從1~8所有章節去查找,主題不限于命令名稱(chēng),還可以是系統調用、函數庫等。
在man查看手冊頁(yè)時(shí),空格鍵向下翻頁(yè),PgUp/PgDn鍵向上/下翻頁(yè),↑/↓鍵向上/下移動(dòng)一行,g/G跳轉到頁(yè)面頂部/底部,q退出,h查看幫助操作。更多詳情,試試“man man”。
用戶(hù)文檔除了man手冊頁(yè),還有info格式的手冊頁(yè),由GNU項目引入,通過(guò)info(information的縮寫(xiě))命令瀏覽,一般UNIX/Linux系統同時(shí)支持man和info兩種風(fēng)格的手冊頁(yè)。
Info手冊頁(yè)按照節點(diǎn)(node)組織,每個(gè)手冊頁(yè)文件是一個(gè)節點(diǎn),手冊頁(yè)內支持鏈接到其他節點(diǎn),如此組織猶如一張網(wǎng),和網(wǎng)頁(yè)類(lèi)似。Info手冊頁(yè)一般存放在/usr/share/info目錄下,其中dir文件是Top節點(diǎn),相當于網(wǎng)站中的index首頁(yè)。
老規矩,info --help試試怎么用,如圖,info也支持較多選項,給出的例子中,直接info <主題>,和man類(lèi)似。不加主題參數時(shí),info默認打開(kāi)Top節點(diǎn)。
在info瀏覽手冊頁(yè)時(shí),空格向下翻頁(yè),PgUp/PgDn鍵向上/下翻頁(yè),↑/↓鍵向上/下移動(dòng)一行,b/e跳轉至當前節點(diǎn)頁(yè)首(begin)/頁(yè)末(end),q退出,Enter跟蹤鏈接,p/n/u跳轉至與當前節點(diǎn)關(guān)聯(lián)的前一個(gè)(previous)/后一個(gè)(next)/上一級(up)節點(diǎn),l回退至上次(last)頁(yè)面,m/g跳轉至本節點(diǎn)內菜單(menu)項,Ctrl-g取消當前要執行的動(dòng)作。更多詳情,試試info info命令。
--help選項、man、info命令,配合網(wǎng)上應用案例,也能摸清個(gè)大概了。
聯(lián)系客服