如何“全域”安裝 tar 文件?
我想安裝一個本地 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/name
or之類的東西./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
,但這很常見。配置你的建構
當你有執行
./configure
and編譯的原始碼時make
,你通常會使用make install
(或sudo make install
)來安裝它。這會將文件從建構目錄複製到安裝位置。當您正在安裝的東西提供可執行命令時,這些執行檔通常會復製到一個目錄中,$PATH
或者您應該考慮將其添加到$PATH
.儘管建構和安裝軟體通常就像執行
./configure
,make
, 有時make check
ormake test
, 然後是make install
or一樣簡單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*
directory
directory
directory
執行檔通常會進入
*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 等專為使用 、 和 等實用程序而設計的發行版
dpkg
,apt-get
那麼aptitude
您通常不應嘗試rpm
使用、yum
和安裝軟體dnf
。但是包管理器的核心原則是相同的。當包管理器安裝命令時,它通常會進入一個預期在使用者
$PATH
環境變數中的目錄。在 GNU/Linux 系統中,包管理器通常管理整個系統——除了你自己以其他方式安裝的任何東西——因此安裝大多數帶有前綴的軟體/usr
,從而將大多數可執行命令放在/usr/bin
. (當然,像執行make install
or一樣sudo make install
,包管理器通常也會將其他文件安裝到其他位置。)