Ich versuche, eine Liste von Paketen aus einer Datei zu entfernen. Ich benutze den folgenden Befehl:
cat packages | xargs sudo apt-get remove
packages
ist meine Datei mit einer Liste von Paketen, die ich entfernen möchte. Alles scheint zu funktionieren, aber apt-get
bricht ab, anstatt mich zwischen Ja und Nein wählen zu lassen.
Ich weiß, dass ich mit dieser -y
Option umgehen kann, aber ich möchte wissen, warum dies geschieht und wie ich die interaktive Auswahl beibehalten kann.
sudo xargs --arg-file packages apt-get remove
?Antworten:
wird direkt
xargs
Argumente aus lesenpackages
, und so wird stdin unbelästigt bleiben.quelle
Eine allgemeinere Lösung wäre
wo Sie ein Problem haben, wenn die Liste der Pakete wirklich lang ist .
Der Grund, warum es nicht funktioniert, ist, dass apt-get versucht, Ihre Bestätigung von der Standardeingabe zu lesen, die - aufgrund der Pipe - an die Pipe angehängt ist
cat
. Im Gegensatz dazusudo
wird das Richtige getan, indem Sie Ihr Passwort durch direktes Öffnen von / dev / tty abfragen. Apt sollte das tun, aber anscheinend nicht.quelle
cat
, aber der von xargs gestartete Prozess hat seine Standardeingabe von / dev / null. Dies ist das Verhalten von Xargs. Einfache Demonstration:echo "" | xargs ls -l /dev/self/fd
apt-get
sollte nicht öffnen/dev/tty
. Sonst könnte man sowas nicht machenyes | apt-get
. Passwörter sind so ziemlich der einzige Fall, bei dem das Lesen von/dev/tty
den Passwörtern das Richtige ist, und sogar so viel ist umstritten.--arg-file
Option durch ephimemient ist im konkreten Fall sogar noch besser, weshalb ich sie positiv bewertet habe. Für die vielen Befehle, die keine solche Option haben, hat die Backtick-Cat-Metapher noch ihre Verwendung.Weil
apt-get
mehr als ein Paket entfernt wird und daher die Aktion bestätigen muss. Da esSTDIN
aus einer Pipe liest und nicht mit dem Terminal verbunden ist, geht es automatisch davon ausNo
.Eine andere Möglichkeit, dies zu umgehen
APT::Get::Assume-Yes
, ist das Hinzufügen zuapt.conf
.quelle
Anscheinend leitet xargs STDIN um, was apt-get verwirrt davon auszugehen, dass es im nicht interaktiven Modus ausgeführt wird.
Ich würde wohl sowas benutzen
um xargs überhaupt zu vermeiden.
("--arg-file" ist weder in apt-get (8) man noch in meinem aktiven Wortschatz enthalten).
quelle
Um das Problem zu umgehen.
Mit GNU xargs und ksh / zsh / bash:
(natürlich nur , wenn der Befehl gerade ist
cat
, dann können Sie ersetzen<(cat packages)
mitpackages
.Oder:
Je nach Format der „Pakete“ Datei (xargs ist eine durch Leerzeichen getrennte Liste von Argumenten und Prozesse zitiert erwarten (
"
,'
und\
), während$(...)
nicht verarbeitet Zitate und erweitert Globbing Muster), können Sie auch tun:Beachten Sie jedoch, dass bei vielen Betriebssystemen die Länge einer Befehlszeile begrenzt ist, sodass dies möglicherweise nicht funktioniert, wenn die Liste groß ist (Sie können
xargs
das Problem jedoch umgehen, indem Sie mehrereapt-get
Befehle ausführen).quelle
Ich kann mich irren, aber Sie können dies versuchen und sehen, ob es funktioniert:
quelle