Lorsque j'utilise apt-get pour installer accidentellement un paquet déjà installé en tant que dépendance d'un autre paquet, il rompt cette "dépendance" en marquant le paquet comme manual
au lieu de auto
.
Je peux corriger manuellement cela plus tard en utilisant Sudo apt-mark markauto package-name
.
Existe-t-il un moyen de dire à apt-get (ou aptitude, dpkg ou à un autre outil) de ne pas rompre le lien ou de ne rien faire si le paquet demandé est déjà installé?
Je rencontre cela de deux manières différentes:
J'ai une liste de paquets à installer pour faire quelque chose de spécifique (à partir d'instructions sur un site Web comme celui-ci).
J'ai une liste de tous les packages que j'ai ajoutés à une installation et je les copie pour qu'ils soient tous ajoutés à une autre installation - par exemple. lorsque je fais une nouvelle installation plutôt que de mettre à niveau mon système.
Tu as dit
Lorsque j'utilise apt-get pour installer accidentellement un paquet déjà installé en tant que dépendance d'un autre paquet, il rompt cette "dépendance" en marquant le paquet comme
manual
au lieu deauto
Je pense que vous vous êtes un peu trompé. Cela ne brisera pas la chaîne de dépendance. L'autre paquet en dépend toujours marqué comme manuel paquet. La seule chose qui est affectée est que, si vous exécutez maintenant apt-get autoremove
ces marqués comme manuels les paquets ne seront pas supprimés. Parce que, pour apt
, marqué comme manuel signifie que l'utilisateur les a installés délibérément, et non pas parce que l'utilisateur voulait d'autres paquets dont le retour dépendait de ces paquets.
Tu as demandé
Existe-t-il un moyen de dire à apt-get (ou aptitude, dpkg ou à un autre outil) de ne pas rompre le lien ou de ne rien faire si le paquet demandé est déjà installé?
Je n'ai trouvé aucun outil pour le faire automatiquement jusqu'à maintenant. Mais cela ne semble pas logique non plus. Parce que, dans ce cas, tous les paquets que vous installerez seront automatically installed
, ce qui les rend vulnérables à la commande apt-get autoremove
.
Donc, si vous voulez que certains paquets soient marqués comme installé automatiquement malgré qu'ils soient installés manuellement, vous devez utiliser apt-get markauto
ou aptitude mark-auto
.
S'il n'y a aucun moyen de faire cela avec un outil existant, voici une solution de contournement.
Exécutez chaque paquet à travers un script bash comme suit:
#!/bin/bash
dpkg -s "$1" &> /dev/null
(($?)) && Sudo apt-get install "$1"
dpkg -s
renvoie 0 si le package (indiqué comme argument du script) est installé; 1 si ce n'est pas. Ce script ne fera rien si le paquet est installé, mais installez-le s'il ne l'est pas - en évitant le problème d'origine.
La commande dpkg
génère une série d'informations qui ne sont pas nécessaires ici. Elle est donc redirigée dans le compartiment de bits /dev/null
pour s'en débarrasser.
(($?))
regarde le code de retour de dpkg
. Cela fonctionne comme C - l’opposé des tests bash normaux. Si $?
vaut 1 parce que le package n'est pas installé, sa valeur sera vraie et la clause &&
sera déclenchée pour installer le package.
Selon les besoins, cela peut être transformé en une fonction et/ou placé en boucle sur une liste de noms de packages.
Si cela devait être beaucoup utilisé, du code serait également ajouté pour vérifier que l'argument, $1
, n'était pas nul et ne contenait pas de blancs imbriqués ou d'autres déchets. Mais tout cela n’est qu’un script normal et ne fait pas partie de la solution elle-même.
J'ai trouvé la technique dpkg
ici .