在 Linux 中移除從原始碼安裝的程式的一種簡單的方法

2019-01-12 23:54:00

不是所有的程式都可以在官方或者第三方庫中找到,因此你不能使用常規的包管理來安裝它們。有時你不得不從原始碼中手動構建這些程式。就如你已經知道的一樣,當你從原始碼中安裝一個程式的時候,這個軟體包所包含的檔案將會複製到原生的多個位置,例如 /usr/local/bin/usr/local/etc/。如果從原始碼中安裝的程式沒有內建的解除安裝程式,當你不再需要這個程式的時候,解除安裝它就會很麻煩。你可能會花費雙倍(甚至更多)的時間找出這些檔案然後手動刪除它們。我以前一直是這樣做的,直到我發現了 GNU Stow。謝天謝地,Stow 有一個很棒的方法可以輕鬆管理從原始碼安裝的程式。

參照官方網站裡的一段介紹,

GNU Stow 是一個符號連結歸集管理器,它可以收集檔案系統上不同目錄中的不同軟體和/或封包,使它們看起來像是一個整體。

簡單來說,Stow 幫助你把這些程式檔案以一種容易管理的方式組織在了一起。在這個方法中,檔案將不會被複製到多個位置。所有的這些檔案都會被儲存在一個特定的資料夾中,通常是以程式名命名的,然後 Stow 會在一個合適的位置為所有的程式檔案建立符號連線。比如 /usr/local/bin 中會包含 /usr/local/stow/vim/bin/usr/local/stow/python/bin 中檔案的符號連結。並且同樣遞回地用於其他的任何的子目錄,例如 .../share.../man,等等。在這篇教學中,我將會舉例教你如何輕鬆地使用 Stow 管理從源中安裝的程式。

安裝 GNU Stow

GNU Stow 在流行 Linux 作業系統的預設庫中都可用。

在 Arch Linux 及它的衍生版本中,執行下面的命令安裝 Stow。

$ sudo pacman -S stow

在 Debian、Ubuntu、Linux Mint 上:

$ sudo apt install stow

在 Fedora 上:

$ sudo dnf install stow

在 RHEL/CentOS 上:

$ sudo yum install epel-release$ sudo yum install stow

在 Linux 上輕鬆移除從原始碼安裝的程式

就像我之前提到的,所有包的程式檔案都將被儲存在位於 /usr/local/stow/ 的一個根資料夾。在這個根資料夾或者父目錄之下,每個包都將儲存在對應的子目錄中。例如,如果我們從原始碼中安裝了 Vim 編輯器,所有關聯到 Vim 的程式檔案和目錄都將儲存在 /usr/local/stow/vim 資料夾之下。如果你從原始碼中安裝了 Python,所有關聯到 python 的檔案都會儲存在 /usr/local/stow/python 之下。

我現在從原始碼中來安裝一個叫做 hello 的程式。

首先下載 hello 程式的壓縮包。

$ wget http://ftp.gnu.org/gnu/hello/hello-2.10.tar.gz

使用下面的命令解壓壓縮包:

$ tar -zxvf hello-2.10.tar.gz

上面的命令將會在當前工作目錄下建立一個叫做 hello-2.10 的目錄,並且提取壓縮包中的所有內容到其中去。

切換到這個目錄當中:

$ cd hello-2.10/

執行下面的命令,並且新增 -prefix 選項。

$ ./configure --prefix=/usr/local/stow/hello

上面的命令將會儲存構建檔案到一個指定位置,在這個例子中是 /usr/local/stow/hello

最後,使用下面的命令構建並安裝 hello 這個程式:

$ make$ sudo make install

就這樣。hello 這個程式就已經安裝在 /usr/local/stow/hello/ 這個位置了。你可以使用下面的 ls 命令確認一下。

$ ls /usr/local/stow/hello/bin share

最後,進入 /usr/local/stow/ 目錄,執行下面的命令來生成必要的符號連結。

$ cd /usr/local/stow/$ sudo stow hello

大功告成!

剛才那一步是將包含在 hello 這個程式中的所有檔案或者目錄建立了連結到 /usr/local/ 目錄中。換一種說法, /usr/local/stow/hello/bin 連結到 /usr/local/share,以及 /usr/local/stow/hello/share/man 連結到 /usr/local/share,還有 /usr/local/stow/hello/share/man 連結到 /usr/local/share/man

你可以使用 ls 命令來確認一下:

$ ls /usr/local/bin/hello

可以使用下面的命令來確認 hello 這個程式是否可以正常工作了:

$ helloHello, world!

很好,它已經開始工作了!!

類似地,你可以像上面描述的那樣安裝程式到它對應的子目錄下。

下面是 Stow 根目錄包含的內容:

$ tree /usr/local/stow/

看,hello 這個程式已經安裝在 /usr/local/stow/hello/ 下。同樣地,所有的包都將儲存在它們對應的目錄之下。

下面進入主要環節,移除 hello 這個程式。首先進入 /usr/local/stow/ 目錄:

$ cd /usr/local/stow/

然後執行下面的命令:

$ sudo stow --delete hello

hello 這個程式就會被移除了。你可以使用下面的命令確認它是否真的被移除了:

$ hello-bash: /usr/local/bin/hello: No such file or directory

看, Hello 已經被移除了!

請注意 Stow 僅僅只移除了符號連結。所有與 hello 這個程式相關的檔案或者目錄還儲存在 /usr/local/stow/hello 目錄下。所以你無需再次下載原始檔就可以再次安裝 hello 這個程式。如果你不再需要它了,直接刪除這個資料夾即可。

$ sudo rm -fr /usr/local/stow/hello/

想了解更多 Stow 的細節,請參閱 man 手冊。

$ man stow

Stow 可以像安裝程式一樣輕鬆地幫你移除它。如果你想知道如何高效的管理很多從原始碼中安裝的程式,GNU Stow 就是一個使得這個任務更加輕鬆的一個選擇,嘗試一下,你一定不會失望的。

這就是所有的內容了,希望對你有所幫助。還有更多幹活即將到來,可以期待一下的!

祝近祺!