すでにインストールされている場合は、依存関係を独立させずにapt-getでインストールします。

すでにインストールされている場合は、依存関係を独立させずにapt-getでインストールします。

apt-get を使用して、別のパッケージの依存関係として既にインストールされているパッケージを誤ってインストールすると、パッケージmanualが ではなく としてマークされ、その「依存関係」が破壊されますauto

後から を使用して手動で修正できますsudo apt-mark markauto package-name

apt-get (または aptitude、dpkg、または別のツール) に、最初からリンクを切断しないように指示したり、要求されたパッケージがすでにインストールされている場合は何もしないように指示したりする方法はありますか?

私はこれにいくつかの異なる方法で遭遇します:

特定の動作を実現するためにインストールする必要があるパッケージのリストがあります (このような Web サイトの手順から)。

あるインストールに追加したすべてのパッケージのリストがあり、それをコピーして、それらをすべて別のインストールに追加します (たとえば、システムのアップグレードではなくクリーン インストールを実行する場合)。

答え1

あなたが言った

apt-getを使用して、すでに別のパッケージの依存関係としてインストールされているパッケージを誤ってインストールすると、パッケージを次のようにマークすることでその「依存関係」が壊れますmanualauto

少し間違っていると思います。依存関係の連鎖は壊れません。他のパッケージはまだこれに依存しています手動としてマークパッケージ。影響を受けるのは、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 と評価され、&&パッケージをインストールする句をトリガーします。

必要に応じて、これを関数にしたり、パッケージ名のリストのループに配置したりすることができます。

これが頻繁に使用される場合は、引数 が null ではなく、埋め込まれた空白やその他のゴミが含まれていないことを確認するコードも追加されます$1。ただし、これらはすべて通常のスクリプトであり、ソリューション自体の一部ではありません。

私はそのdpkg技術を見つけたここ

関連情報