本文共2500余字,預(yù)計(jì)閱讀時(shí)間9分鐘,,本文同步發(fā)布于知乎(賬號(hào)silaoA)和微信公眾號(hào)平臺(tái)(賬號(hào)偽碼人),。 關(guān)注學(xué)習(xí)了解更多的Cygwin、Linux技術(shù),。
前文 Cygwin系列(四):一步一步搭建Cygwin最小系統(tǒng) 和Cygwin系列(七):Cygwin軟件包管理相關(guān)配置 著重介紹了setup
作為包管理器的使用方法,、相關(guān)配置文件,本文介紹Cygwin中另一個(gè)值得嘗試的命令行包管理器 ——apt-cyg
,。
0x00 初識(shí)apt-cygsetup
是Cygwin中圖形界面的包管理器,,操作上基本是傻瓜式的點(diǎn)擊“下一步”;與之對(duì)應(yīng),,存在命令行包管理器,。
GNU/Linux世界里常用有apt-get
、yum
,、pacman
等著名的命令行包管理器,,成熟穩(wěn)定、強(qiáng)大無(wú)比,,Cygwin下則有apt-cyg
這個(gè)友好易用的命令行包管理器,,從名字一看便是模仿apt-get
。Github上托管了39種shell語(yǔ)言版的apt-cyg ,,點(diǎn)擊連接便可看到,,本文要說(shuō)的是搜索結(jié)果排第一的transcode-open/apt-cyg ,遵循MIT開源協(xié)議發(fā)布,,2016年發(fā)布v1版本后便再未更新過(guò),。它其實(shí)就是一個(gè)Shell腳本,幫助用戶查找,、安裝,、卸載軟件包,還可以根據(jù)文件名稱反向查找所屬的軟件包,。
0x01 安裝apt-cygtranscode-open/apt-cyg 頁(yè)面上推薦的安裝步驟為:
1 2 lynx -source rawgit.com/transcode-open/apt-cyg/master/apt-cyg > apt-cyg install apt-cyg /bin
第1行是使用lynx
命令將apt-cyg
腳本從網(wǎng)站下載保存至當(dāng)前目錄的apt-cyg文件,,第2行是使用install
命令將apt-cyg文件安裝至/bin
目錄下,這一步其實(shí)包含了兩個(gè)動(dòng)作:①將apt-cyg文件復(fù)制到/bin
目錄,,②增加/bin/apt-cyg
文件可執(zhí)行權(quán)限,,這樣用戶可以在任意位置使用apt-cyg
命令,。
也可以手工的方式用瀏覽器下載apt-cyg
腳本至本地,通過(guò)cp
命令復(fù)制到/bin
目錄,,再通過(guò)chmod
命令增加/bin/apt-cyg
文件可執(zhí)行權(quán)限,。
apt-cyg
運(yùn)行過(guò)程中依賴bash
、tar
,、wget
,、bzip2
、gawk
,、xz
軟件包中的命令來(lái)完成文件下載,、文本分析、壓縮/解壓等基本功能,,需要先在Cygwin中安裝好這些軟件包,。其中,bash
,、tar
,、wget
、gawk
屬于Base類,,在安裝最小系統(tǒng)時(shí)已包含,;bzip2
、xz
屬于Archive類,,需要通過(guò)setup
先裝上,,確保后續(xù)運(yùn)行apt-cyg
不出錯(cuò)。
0x02 基本使用老規(guī)矩,,先試試apt-cyg --help
看用法提示,,可看出apt-cyg
命令形式為apt-cyg [operation] [options] [targets]
,其中operation代表所支持的15個(gè)操作,,以下逐一說(shuō)明,。查看apt-cyg
文件腳本源碼,可以發(fā)現(xiàn)腳本實(shí)際是通過(guò)相應(yīng)函數(shù)一一實(shí)現(xiàn)這15個(gè)操作,,并且apt-cyg
和setup
共用了一套配置文件,。
mirrorapt-cyg mirror [url]
可以查看/設(shè)置鏡像源地址。如果未給url參數(shù),,apt-cyg
查找/etc/setup/setup.rc
文件中last-mirror
項(xiàng)并打印出來(lái),,以此作為鏡像源地址;如果給定了url參數(shù),,則將/etc/setup/setup.rc
文件中last-mirror
項(xiàng)的值修改為url,。
cache英文cache的意思是緩存,不管是setup
還是apt-cyg
,,安裝軟件包時(shí),,均需從鏡像源站點(diǎn)下載文件,,保存到本地的位置即稱“緩存”,并且本地緩存的目錄結(jié)構(gòu)和鏡像站點(diǎn)保持一致,。
apt-cyg cache [path]
可以查看/設(shè)置本地緩存頂層路徑,。如果未給path參數(shù),apt-cyg
查找/etc/setup/setup.rc
文件中last-cache
項(xiàng)并打印出來(lái),,以此作為本地緩存頂層路徑,;如果給定了path參數(shù),則將/etc/setup/setup.rc
文件中last-cache
項(xiàng)的值修改為path,。
在使用setup
或apt-cyg
時(shí),,允許每次設(shè)定不同的鏡像源,本地緩存頂層路徑之下,,會(huì)給不同的鏡像源建不同的目錄,保存文件不會(huì)造成混亂,。但一般不建議這么做 ,,每個(gè)鏡像源站點(diǎn)同步時(shí)間有先有后,保存的軟件包清單和依賴就不一樣,,在安裝時(shí)可能造成版本混亂,。
install/removeapt-cyg install [targets]
和apt-cyg remove [targets]
分別是安裝、卸載軟件包,,targets參數(shù)指定軟件包名稱,,可以同時(shí)多個(gè)。
apt-cyg
會(huì)從/etc/setup/installed.db
文件中查找本地系統(tǒng)中已經(jīng)安裝的軟件包記錄,,如果已安裝,,再次install則跳過(guò),也就是說(shuō)apt-cyg
不會(huì)自動(dòng)更新軟件包至最新版本 ,;同理,,如果未安裝,卻要remove則也跳過(guò),。
如果installed.db
中沒有記錄,,那么install操作便會(huì)觸發(fā)下載、解壓至根目錄,、執(zhí)行安裝后腳本等一系列動(dòng)作,,最后在installed.db
中增加該軟件包的記錄。apt-cyg
還支持依賴解析 ,,安裝軟件包過(guò)程中,,遞歸地安裝每一個(gè)依賴。但remove操作不會(huì)把卸載軟件包的依賴,。
updateapt-cyg update
是更新軟件源的軟件包清單,,即根據(jù)/etc/setup/setup.rc
中配置的last-mirror
項(xiàng)和本地Cygwin的指令集架構(gòu)版本(x86或者x86_64),,調(diào)用wget
去鏡像站點(diǎn)下載最新的setup.ini
文件至本地緩存。
在進(jìn)行install操作時(shí),,會(huì)自動(dòng)先update,。
downloadapt-cyg download [targets]
僅將軟件包下載到本地緩存但不安裝,targets參數(shù)指定軟件包名稱,,可以同時(shí)多個(gè),。在進(jìn)行install操作時(shí),下載動(dòng)作實(shí)質(zhì)就是download,。
showapt-cyg show targets
展示軟件包基本信息,,targets參數(shù)指定軟件包名稱,可以同時(shí)多個(gè),。apt-cyg
調(diào)用awk
,、sed
在本地緩存的setup.ini
文件中查找匹配的軟件包的名稱、版本,、描述,、依賴等信息。如Cygwin系列(七):Cygwin軟件包管理相關(guān)配置 所舉例的glew軟件包,。 setup.ini文件中g(shù)lew軟件包記錄
depends/rdependsapt-cyg depends targets
查找軟件包的依賴,,apt-cyg rdepends targets
查找依賴該軟件包的更高層軟件包,均以樹形展示,,targets參數(shù)可同時(shí)指定多個(gè)軟件包名稱,。
依賴/反向依賴的解析,實(shí)質(zhì)是調(diào)用awk
,、sed
在本地緩存的setup.ini
文件中根據(jù)軟件包名稱暴力搜索匹配,。
listapt-cyg list targets
在/etc/setup/installed.db
文件中查找與targets參數(shù)匹配的已安裝軟件包的名稱,targets參數(shù)為正則表達(dá)式,,可以同時(shí)多個(gè),。如果未指定targets參數(shù),則列出所有已安裝軟件包,。例如:
1 2 3 4 5 $ apt-cyg list xz bzip2 xz #匹配xz bzip2 #匹配bzip2 libzip2 #匹配bzip2
listall與list類似,,但apt-cyg list targets
是在本地緩存的setup.ini
文件中查找與targets參數(shù)匹配的軟件包的名稱,targets參數(shù)為正則表達(dá)式,,可以同時(shí)多個(gè),。那么,不論本地是否已安裝,,只要鏡像站點(diǎn)中包含,,listall均列出,即listall查找范圍更廣。例如:
1 2 3 4 5 6 7 $ apt-cyg listall bzip2 bzip2 bzip2-debuginfo libzip2 mingw64-i686-bzip2 mingw64-x86_64-bzip2 pbzip2
listfilesapt-cyg listfiles targets
是查找指定軟件包所含的文件清單,,功能與cygcheck -l
相同,,targets參數(shù)指定軟件包名稱,可以同時(shí)多個(gè),。apt-cyg
是通過(guò)查看/etc/setup/
下package.lst.gz
的文件實(shí)現(xiàn)這個(gè)功能的,。
categoryapt-cyg category targets
列出某個(gè)類別下的所有軟件包名稱,targets參數(shù)為類別名稱(如Base,、Archive),,類別名稱見setup
運(yùn)行界面。例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 $ apt-cyg category Base alternatives base-cygwin base-files bash coreutils crypto-policies cygutils cygwin dash diffutils editrights file findutils gawk getent grep gzip hostname info ipc-utils libreadline7 libssl1.1 login man-db mintty ncurses openssl rebase run sed tar terminfo tzdata util-linux vim-minimal which _autorebase
search/searchallapt-cyg search targets
在本地緩存中查找匹配targets的軟件包名稱,,過(guò)程相當(dāng)于是listfiles反向暴力搜索匹配,,apt-cyg searchall targets
在https:///cgi-bin2/package-grep.cgi 查找內(nèi)容與targets匹配的軟件包,targets參數(shù)為正則表達(dá)式,,可以同時(shí)多個(gè),。searchall和cygcheck -f
功能相同,但后者查找范圍僅包括本地已安裝軟件包,,前者范圍更廣,。這對(duì)于查找某個(gè)頭文件、庫(kù)文件所屬軟件包比較有用,,在構(gòu)建程序過(guò)程中遇到報(bào)錯(cuò)“xx符號(hào)未定義的引用”,極有可能就是缺少某個(gè)開發(fā)庫(kù),,但要安裝開發(fā)庫(kù)首先得查出它屬于哪個(gè)包,。 在web頁(yè)面searchall案例
對(duì)比命令行和Web頁(yè)面查詢兩種方式,在https:///cgi-bin2/package-grep.cgi 查找結(jié)果更準(zhǔn)確,,命令行經(jīng)常無(wú)匹配或者匹配過(guò)多,,對(duì)比http請(qǐng)求提交參數(shù),疑似對(duì)特殊符號(hào)處理不同,,應(yīng)是apt-cyg
腳本本身不夠完善,。 web頁(yè)面vs命令行searchall
選項(xiàng)說(shuō)明
--nodeps
選項(xiàng),用于忽略依賴解析,,不建議使用,。
--version
選項(xiàng)打印版本信息。
--help
選項(xiàng)或不帶任何參數(shù)和選項(xiàng),,用于打印使用方法,。
0x03 使用感受及建議使用apt-cyg
過(guò)程,體驗(yàn)確實(shí)比setup
輕量,、快捷不少,,命令行簡(jiǎn)潔高效,圖形界面操作簡(jiǎn)易,二者各有所長(zhǎng),,常用操作一般是install,、remove、show,、listfiles,、searchall。
但在通過(guò)apt-cyg
安裝軟件包時(shí),,偶爾遇到執(zhí)行完命令發(fā)現(xiàn)僅在/etc/setup/installed.db
增加記錄實(shí)際卻未安裝的經(jīng)歷,。安裝執(zhí)行完后建議cygcheck -c
,檢查軟件包安裝完整性,,如不完整則用setup
重新安裝,。另外,上文對(duì)比了apt-cyg searchall
和網(wǎng)頁(yè)查詢的結(jié)果,,后者更加準(zhǔn)確,,建議使用網(wǎng)頁(yè)查詢替代apt-cyg searchall