Ubuntu : apt-get 命令

sparkdev發表於2019-08-13

apt-get 命令是 Ubuntu 系統中的包管理工具,可以用來安裝、解除安裝包,也可以用來升級包,還可以用來把系統升級到新的版本。本文介紹 apt-get 命令的基本用法,演示環境為 Ubuntu 18.04。

基本語法
語法格式:
apt-get [options] command

配置檔案:
早期 apt-get 預設的配置檔案為 /etc/apt/apt.conf,但是當前的 Ubuntu 系統中預設沒有這個檔案。
如果 /etc/apt/apt.conf 檔案存在,apt-get 仍然會讀取它。但現在的設計思路是把配置檔案分隔後放置在 /etc/apt/apt.conf.d 目錄下,這樣更容易管理。

常用選項:

-h, --help              // 檢視幫助文件
-v, --version           // 檢視 apt-get 的版本
-y                      // 在需要確認的場景中迴應 yes
-s, --dry-run           // 模擬執行並輸出結果
-d, --download-only     // 把包下載到快取中而不安裝
--only-upgrade          // 更新當前版本的包而不是安裝新的版本
--no-upgrade            // 在執行 install 命令時,不安裝已安裝包的更新
-q, --quiet             // 減少輸出
--purge                 // 配合 remove 命令刪除包的配置檔案
--reinstall             // 重新安裝已安裝的包或其新版本

常用子命令:
update
update 命令用於重新同步包索引檔案,/etc/apt/sources.list 檔案中的配置指定了包索引檔案的來源。更新了包索引檔案後就可以得到可用的包的更新資訊和新的包資訊。這樣我們本地就有了這樣的資訊:有哪些軟體的哪些版本可以從什麼地方(源)安裝。
update 命令應該總是在安裝或升級包之前執行。

install
install 命令用來安裝或者升級包。每個包都有一個包名,而不是一個完全限定的檔名(例如,在 Debian 系統中,提供的引數是 apt-utils,而不是 apt-utils_1.6.1_amd64.deb)。被安裝的包依賴的包也將被安裝。配置檔案 /etc/apt/sources.list 中包含了用於獲取包的源(伺服器)。install 命令還可以用來更新指定的包。

upgrade
upgrade 命令用於從 /etc/apt/sources.list 中列出的源安裝系統上當前安裝的所有包的最新版本。在任何情況下,當前安裝的軟體包都不會被刪除,尚未安裝的軟體包也不會被檢索和安裝。如果當前安裝的包的新版本不能在不更改另一個包的安裝狀態的情況下升級,則將保留當前版本。必須提前執行 update 命令以便 apt-get 知道已安裝的包是否有新版本可用。
注意 update 與 upgrade 的區別:
update 是更新軟體列表,upgrade 是更新軟體。

dist-upgrade
除執行升級功能外,dist-upgrade 還智慧地處理與新版本包的依賴關係的變化。apt-get 有一個 "智慧" 的衝突解決系統,如果有必要,它將嘗試升級最重要的包,以犧牲不那麼重要的包為代價。因此,distr -upgrade 命令可能會刪除一些包。因此在更新系統中的包時,建議按順序執行下面的命令:
$ apt-get update
$ apt-get upgrade -y
$ apt-get dis-upgrade -y

remove
remove 與 install 類似,不同之處是刪除包而不是安裝包。注意,使用 remove 命令刪除一個包會將其配置檔案留在系統上。

purge
purge 命令與 remove 命令類似,purge 命令在刪除包的同時也刪除了包的配置檔案。

autoremove
autoremove 命令用於刪除自動安裝的軟體包,這些軟體包當初是為了滿足其他軟體包對它的依賴關係而安裝的,而現在已經不再需要了。

download
download 命令把指定包的二進位制檔案下載到當前目錄中。注意,是類似 *.deb 這樣的包檔案。

clean
clean 命令清除在本地庫中檢索到的包。它從 /var/cache/apt/archives/ 和 /var/cache/apt/archives/partial/ 目錄刪除除鎖檔案之外的所有內容。

autoclean
與 clean 命令類似,autoclean 命令清除檢索到的包檔案的本地儲存庫。不同之處在於,它只刪除不能再下載的軟體包檔案,而且這些檔案在很大程度上是無用的。這允許長時間維護快取,而不至於大小失控。

source
source 命令下載包的原始碼。預設會下載最新可用版本的原始碼到當前目錄中。

changelog
changelog 命令嘗試下載並顯示包的更新日誌。

常見用法

檢視幫助文件

$ apt-get -h

更新包索引檔案

$ sudo apt-get update

安裝包

$ sudo apt-get install nginx

在需要確認的場景中迴應 yes
多數包在安裝前都需要與使用者互動,在使用者確認後才繼續安裝。而在自動化的任務中是沒辦法與使用者互動的。-y 選項可以在這樣的場景中發揮作用,其效果就像是使用者確認了安裝操作一樣:

$ sudo apt-get install -y nginx

安裝系統中有更新的包

$ sudo apt-get update
$ sudo apt-get upgrade -y
$ sudo apt-get dis-upgrade -y

重新安裝已安裝的包
如果我們認為一個包工作不正常,可以嘗試重新安裝它,為 install 命令新增 --reinstall 選項就可以了。另外,如果已安裝的包有了更新或新版本,也可以用這個方法把包升級到最新的版本:

$ sudo apt-get install --reinstall curl

更新指定的包
比較奇怪的是更新指定的包居然不是通過 upgrade 命令完成的,而是使用 intall 命令,注意:是 install 命令:

$ sudo apt-get install vim

模擬執行命令並輸出結果
應用 -s 選項後命令並不會真正執行,但是會模擬執行並輸出結果,比如下面的例子:

$ sudo apt-get update
$ sudo apt-get -s upgrade

新增 -s 選項後,upgrade 命令會輸出將要被更新的軟體但不會真的執行升級操作。

檢查某個包的版本
通過下面的命令可以檢視已安裝包或即將安裝包的版本:

$ sudo apt-get -s install vim

下面是一個已安裝包的例子:

下面是一個未安裝包的例子:

安裝指定版本的包
注意,這裡指的是包的版本號:

$ sudo apt-get install tree=1.7.0-5

把包下載到快取中而不安裝
選項 -d, --download-only 告訴命令只把包下載到快取中而不安裝它們,主要用在把下載包和安裝包分開的場景,比如系統預設的自動化更新:

$ sudo apt-get install -d nginx
$ sudo apt-get upgrade -d
$ sudo apt-get dist-upgrade -d

刪除包
remove 命令的特點是隻刪除程式檔案,保留相關的配置檔案:

$ sudo apt-get remove vim

如果要徹底清除包,可以使用 purge 命令,它會同時刪除程式檔案及其配置檔案:

$ sudo apt-get purge vim

autoremove 命令用於刪除自動安裝的軟體包,這些軟體包當初是為了滿足其他軟體包對它的依賴關係而安裝的,而現在已經不再需要了。因此在刪除包後執行一下 autoremove 是個不錯的選擇:

$ sudo apt-get autoremvoe

清除系統中快取的包安裝檔案
安裝包的過程實際上是先把包安裝檔案下載到快取目錄,然後執行安裝。久而久之系統中會存在大量無用的包安裝檔案,clean 命令可以清除這些快取的包安裝檔案:

$ sudo apt-get clean

clean 命令從 /var/cache/apt/archives/ 和 /var/cache/apt/archives/partial/ 目錄刪除除鎖檔案之外的所有內容。

autoclean 命令與 clean 命令類似。不同之處在於,它只刪除不能再下載的軟體包檔案,而且這些檔案在很大程度上是無用的。這允許長時間維護快取,而不至於大小失控:

$ sudo apt-get autoclean

在執行 remove 命令時使用 --purge 選項的效果等同於執行 purge 命令:

$ sudo apt-get remove --purge vim

在執行  install/remove 命令時使用 --autoremove 選項,可以同時刪除無用的依賴包,類似在執行完  install/remove 命令後再執行一次 autoremove 命令:

$ sudo apt-get remove --autoremove vim

在執行 install/upgrade 命令時顯示更詳細的版本資訊
通過 -V 選項,可以讓 install/upgrade 命令輸出包的具體版本,下面是預設的輸出:

$ sudo apt-get upgrade -s

下面是新增 -V 選項後的輸出:

$ sudo apt-get upgrade -V -s

減少輸出
既然可以增加詳細的輸出資訊,也可以靈活地使用 -q 選項來減少輸出的資訊:

$ sudo apt-get install  -q curl
$ sudo apt-get install  -q=2 curl

檢視已安裝包的更改日誌
可以通過 changelog 命令來檢視包的更新記錄:

$ apt-get changelog tree

下載包的原始碼(source code)
apt-get source 命令用來下載包的原始碼。要讓 apt-get source 命令起作用需要先更新 /etc/apt/sources.list 檔案,新增 deb-src 配置,其實就是取消掉原本被註釋掉的以 deb-src 開頭的行。在 desktop 版的系統中,還可以通過  "Software & Updates" UI 來做同樣的事情,在 "Ubuntu Software" 選項卡中選中 "Source code" 項即可:

現在再執行 apt-get source 命令並指定包的名稱,就可以下載到該包的原始碼了:

$ apt-get source tree

檢視 apt-get 的版本

$ apt-get -v

這裡顯示的居然是 apt,太奇葩了!接著看:

原來 apt-get、apt-cache 和 apt-config 的功能都是由 apt 命令提供的。

檢視系統的更新記錄
日誌檔案 /var/log/apt/history.log 記錄了系統的更新歷史記錄。通過它可以檢視所有通過 apt 命令執行的安裝、升級、刪除記錄:

$ less /var/log/apt/history.log

參考:
apt-get man page
apt.conf man page

相關文章