
Cuando uso apt-get para instalar accidentalmente un paquete que ya está instalado como una dependencia de otro paquete, rompe esa "dependencia" marcando el paquete como manual
en lugar de auto
.
Puedo arreglar esto manualmente más tarde usando sudo apt-mark markauto package-name
.
¿Hay alguna manera de decirle a apt-get (o aptitude, dpkg u otra herramienta) que no rompa el enlace en primer lugar o que no haga nada si el paquete solicitado ya está instalado?
Me encuentro con esto de dos maneras diferentes:
Tengo una lista de paquetes para instalar para que algo específico funcione (de las instrucciones en un sitio web como este).
Tengo una lista de todos los paquetes que agregué a una instalación y la copio para que todos se agreguen a otra instalación, por ejemplo, cuando hago una instalación limpia en lugar de una actualización de mi sistema.
Respuesta1
Usted dijo
Cuando uso apt-get para instalar accidentalmente un paquete que ya está instalado como una dependencia de otro paquete, rompe esa "dependencia" marcando el paquete como
manual
en lugar deauto
Creo que te equivocaste un poco. No romperá la cadena de dependencia. El otro paquete todavía depende de esto.marcado como manualpaquete. Lo único que se ve afectado es que, si ahora ejecuta apt-get autoremove
estosmarcado como manualLos paquetes no se eliminarán. Porque, apt
marcado como manual significa que el usuario los instaló deliberadamente, no porque el usuario quisiera otros paquetes que a cambio dependieran de estos paquetes.
Tu preguntaste
¿Hay alguna manera de decirle a apt-get (o aptitude, dpkg u otra herramienta) que no rompa el enlace en primer lugar o que no haga nada si el paquete solicitado ya está instalado?
No he encontrado ninguna herramienta para hacerlo automáticamente hasta ahora. Pero esto tampoco parece lógico. Porque, en ese caso, será como si todos los paquetes que estuviera instalando fueran automatically installed
, haciéndolos vulnerables al apt-get autoremove
comando.
Entonces, si desea que algún paquete se marque comoinstalado automáticamentea pesar de instalarse manualmente, debes usar apt-get markauto
o aptitude mark-auto
.
Respuesta2
Si no hay forma de hacer esto con una herramienta existente, aquí tienes una solución.
Ejecute cada paquete a través de un script bash como el siguiente:
#!/bin/bash
dpkg -s "$1" &> /dev/null
(($?)) && sudo apt-get install "$1"
dpkg -s
devuelve 0 si el paquete (dado como argumento del script) está instalado; 1 si no lo es. Este script no hará nada si el paquete está instalado, pero lo instalará si no lo está, evitando el problema original.
El dpkg
comando genera una gran cantidad de información que no es necesaria aquí, por lo que se redirige al /dev/null
depósito de bits para eliminarla.
(($?))
mira el código de retorno de dpkg
. Funciona como C, lo opuesto a las pruebas de bash normales. Si $?
es 1 porque el paquete no está instalado, esto se evaluará como verdadero y activará la &&
cláusula para instalar el paquete.
Dependiendo de lo que se necesite, esto puede convertirse en una función y/o colocarse en un bucle sobre una lista de nombres de paquetes.
Si esto se usara mucho, entonces también se agregaría código para verificar que el argumento $1
no fuera nulo y no contuviera espacios en blanco incrustados u otra basura. Pero todo eso son sólo secuencias de comandos normales y no forman parte de la solución en sí.
encontré la dpkg
técnicaaquí.