
當我使用 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 markauto
或aptitude 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
技術這裡。