xargs -a packages sudo apt-get remove
direcionará xargs
para ler os argumentos de packages
e, assim, deixará o stdin não sermovido.
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.
xargs -a packages sudo apt-get remove
direcionará xargs
para ler os argumentos de packages
e, assim, deixará o stdin não sermovido.
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.
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).
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
.
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
).
Posso estar errado, mas você pode tentar isso e ver se funciona:
yes | sudo apt-get remove $(cat packages)