ti-enxame.com

Por que os xargs fazem com que o apt-get aborte?

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

cat packages | xargs Sudo apt-get remove

packages é meu arquivo contendo uma lista de pacotes que eu quero remover. Tudo parece funcionar, mas apt-get Aborta em vez de me deixar escolher sim ou não.

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

17
subb
xargs -a packages Sudo apt-get remove

direcionará xargs para ler argumentos de packages, e assim vai deixar Stdin sem serem soltados.

13
ephemient

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 .

A razão pela qual não está funcionando é que apt-get está tentando ler sua confirmação a partir da entrada padrão que - por causa do tubo - é anexado a cat. Portariwise, Sudo A coisa certa, pedindo sua senha abrindo/dev/tty diretamente. Apt deve fazer isso, mas aparentemente não.

10
msw

Aparentemente, os Xargs redirecionam Stdin que confunde 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 é nem em apt-get (8) homem nem no meu vocabulário ativo).

2
Onlyjob

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

Outra maneira de se locomover isso é adicionar APT::Get::Assume-Yes para apt.conf.

2
bahamat

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ê pode substituir <(cat packages) com packages.

Ou:

< packages Sudo xargs sh -c 'exec apt-get remove "[email protected]" < /dev/tty' sh

Dependendo do formato do arquivo "Pacotes" (Xargs espera uma lista separada em branco de argumentos e cotações de processos (", ' E \), Enquanto $(...) Não processa citações e expande padrões de 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, para que talvez não funcione se a lista for grande (enquanto xargs funcionará em torno do problema executando vários apt-get comandos).

1
Stéphane Chazelas

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

yes | Sudo apt-get remove $(cat packages)
0
fromnaboo