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 -y
opção, mas gostaria de saber por que isso está acontecendo e como posso manter a escolha interativa.
sudo xargs --arg-file packages apt-get remove
?Respostas:
irá direcionar
xargs
a leitura dos argumentospackages
e, portanto, deixará o stdin sem ser molestado.fonte
Uma solução mais geral seria
onde você terá um problema se a lista de pacotes for realmente longa .
A razão pela qual não está funcionando é que o apt-get está tentando ler sua confirmação na entrada padrão à qual - por causa do pipe - está conectado
cat
. Por outro lado,sudo
faz a coisa certa pedindo sua senha, abrindo / dev / tty diretamente. O Apt deve fazer isso, mas aparentemente não.fonte
cat
, mas o processo iniciado pelo xargs tem sua entrada padrão vinda de / dev / null. Este é o comportamento de xargs. Demonstração simples:echo "" | xargs ls -l /dev/self/fd
apt-get
não deve abrir/dev/tty
. Caso contrário, você não poderia fazer coisas comoyes | apt-get
. As senhas são praticamente o único caso em que a leitura/dev/tty
é a coisa certa, e até isso é discutível.--arg-file
opção pelo ephimemient é ainda melhor para o caso específico, e foi por isso que eu a votei. Para os muitos comandos que não têm essa opção, a metáfora backtick-cat ainda tem seus usos.Porque
apt-get
está removendo mais de um pacote e, portanto, deve confirmar a ação. Como está lendoSTDIN
de um tubo e não está conectado ao terminal, ele assume automaticamenteNo
.Outra maneira de contornar isso é adicionar
APT::Get::Assume-Yes
aapt.conf
.fonte
Aparentemente, o xargs redireciona o STDIN, o que confunde o apt-get ao assumir que ele está sendo executado no modo não interativo.
Eu provavelmente usaria algo como
para evitar o uso de xargs.
("--arg-file" não está no apt-get (8) man nem no meu vocabulário ativo).
fonte
Para contornar.
Com GNU xargs e ksh / zsh / bash:
(é claro, se o comando for justo
cat
, você poderá substituir<(cat packages)
porpackages
.Ou:
Dependendo do formato do arquivo "packages" (o xargs está esperando uma lista em branco separada de argumentos e processos entre aspas (
"
,'
e\
), embora$(...)
não processe aspas e expanda padrões de globbing), você também pode: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
isso contornará o problema executando váriosapt-get
comandos).fonte
Posso estar errado, mas você pode tentar isso e ver se funciona:
fonte