J'essaie de supprimer une liste de packages d'un fichier. J'utilise la commande suivante:
cat packages | xargs sudo apt-get remove
packages
est mon fichier contenant une liste de packages que je souhaite supprimer. Tout semble fonctionner, mais apt-get
abandonne au lieu de me laisser choisir oui ou non.
Je sais que je peux contourner cela avec l' -y
option, mais je voudrais savoir pourquoi cela se produit et comment puis-je conserver le choix interactif.
sudo xargs --arg-file packages apt-get remove
?Réponses:
dirigera
xargs
pour lire les arguments depackages
, et ainsi il laissera stdin sans souci.la source
Une solution plus générale serait
où vous aurez un problème si la liste des packages est vraiment longue .
La raison pour laquelle cela ne fonctionne pas est qu'apt-get essaie de lire votre confirmation à partir de l'entrée standard à laquelle - à cause du tuyau - est attachée
cat
. Au contraire,sudo
fait la bonne chose en demandant votre mot de passe en ouvrant / dev / tty directement. Apt devrait le faire, mais apparemment pas.la source
cat
, mais le processus démarré par xargs a son entrée standard provenant de / dev / null. C'est le comportement de xargs. Démonstration simple:echo "" | xargs ls -l /dev/self/fd
apt-get
ne devrait pas ouvrir/dev/tty
. Sinon, vous ne pourriez pas faire des choses commeyes | apt-get
. Les mots de passe sont à peu près le seul cas où la lecture/dev/tty
est la bonne chose, et même cela est discutable.--arg-file
option est encore meilleure pour le cas spécifique, c'est pourquoi je l'ai votée positivement. Pour les nombreuses commandes qui n'ont pas une telle option, la métaphore backtick-cat a toujours ses utilisations.Parce que
apt-get
supprime plusieurs packages et doit donc confirmer l'action. Puisqu'il lit àSTDIN
partir d'un tuyau et n'est pas connecté au terminal, il suppose automatiquementNo
.Une autre façon de se déplacer est d'ajouter
APT::Get::Assume-Yes
àapt.conf
.la source
Apparemment, xargs redirige STDIN, ce qui confond apt-get à supposer qu'il fonctionne en mode non interactif.
J'utiliserais probablement quelque chose comme
pour éviter d'utiliser xargs du tout.
("--arg-file" n'est ni dans apt-get (8) man ni dans mon vocabulaire actif).
la source
Pour contourner.
Avec GNU xargs et ksh / zsh / bash:
(bien sûr, si la commande est juste
cat
, vous pouvez la remplacer<(cat packages)
parpackages
.Ou:
Selon le format du fichier "packages" (xargs attend une liste d'arguments séparés par des blancs et traite les guillemets (
"
,'
et\
), alors$(...)
qu'il ne traite pas les guillemets et développe les modèles de globalisation), vous pouvez également faire:Mais veuillez noter que de nombreux systèmes d'exploitation ont une limite sur la longueur d'une ligne de commande, de sorte que cela peut ne pas fonctionner si la liste est grande (tandis que
xargs
contournera le problème en exécutant plusieursapt-get
commandes).la source
Je peux me tromper, mais vous pouvez essayer cela et voir si cela fonctionne:
la source