Estoy tratando de eliminar una lista de paquetes de un archivo. Estoy usando el siguiente comando:
cat packages | xargs sudo apt-get remove
packages
es mi archivo que contiene una lista de paquetes que quiero eliminar. Todo parece funcionar, pero apt-get
aborta en lugar de dejarme elegir sí o no.
Sé que puedo solucionar esto con la -y
opció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
xargs
lectura 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,sudo
hace 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/fd
apt-get
no 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/tty
es lo correcto, e incluso eso es discutible.--arg-file
opció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-get
está eliminando más de un paquete, y por lo tanto debe confirmar la acción. Como está leyendoSTDIN
desde una tubería y no está conectado al terminal, asume automáticamenteNo
.Otra forma de evitar esto es agregar
APT::Get::Assume-Yes
aapt.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
xargs
que solucionará el problema ejecutando variosapt-get
comandos).fuente
Puedo estar equivocado, pero puedes probar esto y ver si funciona:
fuente