Por que os xargs fazem com que o apt-get seja abortado?

16

Estou tentando remover uma lista de pacotes de um arquivo. Estou usando o seguinte comando:

cat packages | xargs sudo apt-get remove

packages é o meu arquivo que contém uma lista de pacotes que desejo remover. Tudo parece funcionar, mas apt-get aborta em vez de me deixar escolher sim ou não.

Sei que posso contornar isso com a opção -y , mas gostaria de saber por que isso está acontecendo e como posso manter a opção interativa.

    
por subb 15.11.2010 / 06:42

6 respostas

13

xargs -a packages sudo apt-get remove

direcionará xargs para ler os argumentos de packages e, assim, deixará o stdin não sermovido.

    
por 15.11.2010 / 18:34
10

Uma solução mais geral seria

 sudo apt-get remove 'cat packages'

onde você terá um problema se a lista de pacotes for realmente longa .

O motivo pelo qual ele não está funcionando é que o apt-get está tentando ler sua confirmação da entrada padrão que - por causa do pipe - está anexada a cat . Ao contrário, sudo faz a coisa certa perguntando sua senha abrindo / dev / tty diretamente. Apt deveria fazer isso, mas aparentemente não faz.

    
por 15.11.2010 / 13:10
2

Aparentemente, o xargs redireciona STDIN, o que confunde o apt-get para assumir que ele está sendo executado no modo não interativo.

Eu provavelmente usaria algo como

sudo apt-get remove $(cat packages)

para evitar o uso de xargs.

("- arg-file" não está no apt-get (8) man, nem no meu vocabulário ativo).

    
por 03.10.2012 / 00:41
1

Porque apt-get está removendo mais de um pacote e, portanto, deve confirmar a ação. Como ele está lendo STDIN de um pipe e não está conectado ao terminal, ele assume automaticamente No .

Outra maneira de contornar isso é adicionar APT::Get::Assume-Yes a apt.conf .

    
por 05.07.2012 / 10:10
1

Para contornar.

Com GNU xargs e ksh / zsh / bash:

sudo xargs -r --arg-file <(cat packages) apt-get remove

(claro, se o comando for apenas cat , você poderá substituir <(cat packages) por packages .

Ou:

< packages sudo xargs sh -c 'exec apt-get remove "$@" < /dev/tty' sh

Dependendo do formato do arquivo "packages" (xargs espera uma lista separada em branco de argumentos e cotações de processos ( " , ' e \ ), enquanto $(...) não processa aspas e expande padrões globbing), você também pode fazer:

sudo apt-get remove $(cat packages)

Mas observe que muitos sistemas operacionais têm um limite no comprimento de uma linha de comando, portanto isso pode não funcionar se a lista for grande (enquanto xargs resolverá o problema executando vários comandos apt-get ).

    
por 03.10.2012 / 14:02
0

Posso estar errado, mas você pode tentar isso e ver se funciona:

yes | sudo apt-get remove $(cat packages)
    
por 06.10.2012 / 12:15

Tags