Estoy tratando de eliminar una lista de paquetes de un archivo. Estoy usando el siguiente comando:
cat packages | xargs sudo apt-get remove
packageses mi archivo que contiene una lista de paquetes que quiero eliminar. Todo parece funcionar, pero apt-getaborta en lugar de dejarme elegir sí o no.
Sé que puedo solucionar esto con la -yopción, pero me gustaría saber por qué sucede esto y cómo puedo mantener la opción interactiva.

sudo xargs --arg-file packages apt-get remove?Respuestas:
dirigirá la
xargslectura de argumentospackages, por lo que dejará stdin sin molestar.fuente
Una solución más general sería
donde tendrá un problema si la lista de paquetes es realmente larga .
La razón por la que no funciona es que apt-get está tratando de leer su confirmación de la entrada estándar a la que, debido a la tubería, está conectada
cat. Por el contrario,sudohace lo correcto al pedir su contraseña abriendo / dev / tty directamente. Apt debería hacer esto, pero aparentemente no lo hace.fuente
cat, pero el proceso iniciado por xargs tiene su entrada estándar proveniente de / dev / null. Este es el comportamiento de xargs. Demostración simple:echo "" | xargs ls -l /dev/self/fdapt-getno debería abrirse/dev/tty. De lo contrario no podrías hacer cosas comoyes | apt-get. Las contraseñas son prácticamente el único caso en el que leer/dev/ttyes lo correcto, e incluso eso es discutible.--arg-fileopción es aún mejor para el caso específico, por eso lo voté. Para los muchos comandos que no tienen esa opción, la metáfora backtick-cat todavía tiene sus usos.Porque
apt-getestá eliminando más de un paquete, y por lo tanto debe confirmar la acción. Como está leyendoSTDINdesde una tubería y no está conectado al terminal, asume automáticamenteNo.Otra forma de evitar esto es agregar
APT::Get::Assume-Yesaapt.conf.fuente
Aparentemente, xargs redirige STDIN, lo que confunde a apt-get para suponer que se está ejecutando en modo no interactivo.
Probablemente usaría algo como
para evitar usar xargs en absoluto.
("--arg-file" no está en apt-get (8) man ni en mi vocabulario activo).
fuente
Para trabajar alrededor.
Con GNU xargs y ksh / zsh / bash:
(por supuesto, si el comando es justo
cat, puede reemplazarlo<(cat packages)conpackages.O:
Dependiendo del formato del archivo de "paquetes" (xargs espera una lista separada por espacios en blanco de argumentos y comillas de procesos (
",'y\), mientras$(...)que no procesa comillas y expande patrones globales), también podría hacer:Pero tenga en cuenta que muchos sistemas operativos tienen un límite en la longitud de una línea de comando, por lo que puede no funcionar si la lista es grande (mientras
xargsque solucionará el problema ejecutando variosapt-getcomandos).fuente
Puedo estar equivocado, pero puedes probar esto y ver si funciona:
fuente