使用 apt-get 安裝依賴項,如果已安裝,則不使其獨立

使用 apt-get 安裝依賴項,如果已安裝,則不使其獨立

當我使用 apt-get 意外安裝已作為另一個套件的依賴項安裝的套件時,它會透過將該套件標記為而manual不是 來破壞該「依賴關係」 auto

我可以稍後使用 手動修復此問題sudo apt-mark markauto package-name

有沒有辦法告訴 apt-get (或 aptitude、dpkg 或其他工具)不要先斷開鏈接,或者如果請求的包已安裝,則不執行任何操作?

我透過幾種不同的方式遇到了這個問題:

我有一個要安裝的軟體包列表,以實現特定的工作(來自類似網站上的說明)。

我有一個已添加到一個安裝中的所有軟體包的列表,我將其複製,以便將它們全部添加到另一個安裝中 - 例如,當我進行全新安裝而不是升級系統時。

答案1

你說

當我使用 apt-get 意外安裝已作為另一個包的依賴項安裝的包時,它會通過將該包標記為而manual不是破壞該“依賴關係”auto

我想,你有點錯了。它不會破壞依賴鏈。其他套件仍然依賴於此標記為手動包裹。唯一受影響的是,如果您現在正在運行apt-get autoremove這些標記為手動包不會被刪除。因為,apt標記為手動意味著用戶故意安裝它們,而不是因為用戶想要其他依賴這些套件的套件。

你問

有沒有辦法告訴 apt-get (或 aptitude、dpkg 或其他工具)不要先斷開鏈接,或者如果請求的包已安裝,則不執行任何操作?

到目前為止,我還沒有找到任何工具可以自動執行此操作。但這聽起來也不符合邏輯。因為,在這種情況下,它就像您正在安裝的每個軟體包一樣automatically installed,使它們容易受到apt-get autoremove命令的攻擊。

所以,如果你想將某個包標記為自動安裝儘管是手動安裝,但您必須使用apt-get markautoaptitude mark-auto

答案2

如果使用現有工具無法做到這一點,這裡有一個解決方法。

透過 bash 腳本運行每個包,如下所示:

#!/bin/bash
dpkg -s "$1" &> /dev/null
(($?)) && sudo apt-get install "$1"

dpkg -s如果安裝了套件(作​​為腳本的參數給出),則傳回 0; 1 如果不是。如果安裝了該軟體包,此腳本將不執行任何操作,但如果未安裝該軟體包,則安裝它 - 避免了最初的問題。

dpkg命令輸出了一堆此處不需要的信息,因此將其重定向到位/dev/null桶中以將其刪除。

(($?))查看來自的返回代碼dpkg。它的工作原理與 C 類似——與正常的 bash 測試相反。如果$?因為軟體包未安裝而為 1,則這將評估為 true 並觸發子句&&來安裝軟體包。

根據需要,可以將其製作成函數和/或放置在套件名稱清單上的循環中。

如果經常使用它,那麼還將添加程式碼來驗證參數$1不為空並且不包含嵌入的空格或其他垃圾。但所有這些都只是正常的腳本,而不是解決方案本身的一部分。

我找到了dpkg技術這裡

相關內容