Command-Line

如何“全域”安裝 tar 文件?

  • December 16, 2018

我想安裝一個本地 tar 文件,使其可以立即在命令行上使用,就像我使用了“sudo apt-get install XYZ”一樣(假設沒有依賴項)。

我知道如何解壓 tar,然後使用 configure/make 進行編譯,但這只會給我留下一個執行檔,我必須稍後添加一個路徑。

我想我可以復製到 /bin 並完成它,但我只是想知道這裡的標準做法是什麼。

作為獎勵,很高興知道如何使用 RPM 和其他類型的軟體包來做到這一點。

如果您要安裝的程序遵循良好的做法,您可以使用

./configure
make
make install

./configure檢查您的系統是否滿足所有要求並配置安裝選項。make編譯所有內容,並將make install所有必要的文件複製到正確的位置。您不想手動完成最後一步,因為將所有庫、手冊頁和諸如此類的東西放到正確的位置會非常乏味。

您還可以定義軟體包的安裝位置。例如,如果你想在你的主目錄中安裝一個包(因為你沒有管理員權限),你可以使用

./configure --prefix="$HOME"/somefolder

make install然後將其安裝到此文件夾。不過,通常你不需要這個。

這個答案基於我發布的幾條聊天消息,現在作為擴展摘要。

環境$PATH變數

通過“在命令行上立即可用”,我假設您的意思是您可以像 一樣執行它name,而不必鍵入/path/to/name諸如/home/galahad/bin/nameor之類的東西./name

您的$PATH環境變數包含 - 分隔的:目錄名稱列表。當您在 shell 中執行包含/字元的命令時,它會被解釋為要執行的執行檔的確切位置和名稱。但是,當您執行一個包含 a的命令時/,您的 shell 會在目錄中搜尋該$PATH名稱的執行檔,並執行它找到的第一個執行檔。(它可能還記得您之前執行的執行檔的位置。因此,在實踐中,它不必每次都搜尋它們。)

這就是為什麼執行位於目前目錄中./name的執行檔的常用方法。name相反,執行name將搜尋$PATH.

如果你執行echo "$PATH",你會看到類似這樣的東西,儘管它可能不完全是這樣:

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

中的目錄$PATH不必被呼叫bin,但這很常見。

配置你的建構

當你有執行./configureand編譯的原始碼時make,你通常會使用make install(或sudo make install)來安裝它。這會將文件從建構目錄複製到安裝位置。當您正在安裝的東西提供可執行命令時,這些執行檔通常會復製到一個目錄中,$PATH或者您應該考慮將其添加到$PATH.

儘管建構和安裝軟體通常就像執行./configure, make, 有時make checkor make test, 然後是make installor一樣簡單sudo make install,但您有時需要將選項傳遞給configure腳本來配置建構。特別是,正如 pfnuesel 所說,這是您配置軟體安裝*位置的方式。*儘管該make install步驟實際安裝了軟體,但通常會在該./configure步驟中建立安裝所有內容的位置。

最常見的選項是--prefix. 當您不知道configure使用什麼時,預設前綴通常是/usr/local. (有時,程序或庫的原始碼預設使用其他前綴。幸運的是,這種情況很少見。)

所以./configure通常等價於./configure --prefix=/usr/local。要在您的主目錄中安裝軟體,您可以使用./configure --prefix=/home/galahad(如果/home/galahad是您的主目錄)或--prefix="$HOME". 當然,您仍然必須使用make. 我應該說,並非所有以原始碼形式分發的軟體都是以這種方式建構的。您應該始終在提取的原始碼存檔中查找文件。

什麼--prefix意思

執行時,表示該軟體應安裝在該目錄下。但這很少,如果有的話,將鬆散的文件放在. 相反,它將用於不同目的的文件放在. 如果這些子目錄不存在,它會創建它們。./configure --prefix=*directory*directorydirectorydirectory

執行檔通常會進入*directory*/bin,但*directory*/sbin如果它們通常用於系統管理,它們可能會進入,或者*directory*/games如果它們是遊戲,它們可能會進入(現在更罕見)。庫進入*directory*/lib或其他類似名稱的目錄,如*directory*/lib32. 標頭檔進入*directory*/include. 手冊頁進入*directory*/man。軟體使用的數據文件進入*directory*/share.

這就是*directory成為前綴*的意思。它是包含將安裝不同文件的位置的父目錄。因此,它作為前綴出現在執行或創建的大多數文件和目錄的絕對路徑中。make install``sudo make install

這有一些例外。系統範圍的配置文件(有時在安裝將使用它們的軟體時創建,但並非總是如此)通常以/etc. 這通常不受指定不同前綴的影響。即使您在 中安裝了很多軟體/usr/local,它仍然主要使用/etc,並且您的/usr/local/etc目錄可能不存在、為空或包含很少的文件。

在許多系統上,您可以通過執行來找到有關典型文件系統佈局的更多資訊man hier。如果您使用的是 GNU/Linux 系統,您可能會對Filesystem Hierarchy Standard感興趣。

您的系統安裝軟體的位置

作為系統一部分的大多數程序,包括絕大多數 GNU/Linux 作業系統(GoboLinux是一個例外)和一些其他類 Unix 系統中由包管理器安裝的程序,都以/usr. 您很少將該前綴傳遞給./configure,因為您通常希望避免與系統提供的軟體發生衝突。

/usr允許位於網路共享或分區上,否則在引導過程的早期還沒有掛載。此時必須可訪問的軟體通常安裝在/. 這就是為什麼兩者都/usr/bin存在/bin並且為什麼sh通常是/bin/sh

包管理

大多數包管理器都支持安裝二進製文件(儘管有例外)。通常,當您使用包管理器在 GNU/Linux 系統中安裝軟體時,您正在安裝二進制包。在這種情況下,包管理器本身不會編譯任何東西。但是,安裝仍然涉及將文件複製或提取到文件系統中的位置。

這就是我說你的包管理器安裝大多數帶有前綴的東西時的意思/usr。我並不是說它一定要執行./configure --prefix=/usr或任何./configure命令。

不同的作業系統有不同的包管理器。如果您使用的是 Debian 或 Ubuntu 等專為使用 、 和 等實用程序而設計的發行版dpkgapt-get那麼aptitude通常不應嘗試rpm使用、yum和安裝軟體dnf

但是包管理器的核心原則是相同的。當包管理器安裝命令時,它通常會進入一個預期在使用者$PATH環境變數中的目錄。在 GNU/Linux 系統中,包管理器通常管理整個系統——除了你自己以其他方式安裝的任何東西——因此安裝大多數帶有前綴的軟體/usr,從而將大多數可執行命令放在/usr/bin. (當然,像執行make installor一樣sudo make install,包管理器通常也會將其他文件安裝到其他位置。)

引用自:https://unix.stackexchange.com/questions/389896