为什么 xargs 会导致 apt-get 中止?

为什么 xargs 会导致 apt-get 中止?

我正在尝试从文件中删除包列表。我正在使用以下命令:

cat packages | xargs sudo apt-get remove

packages我的文件包含我要删除的软件包列表。一切似乎都有效,但apt-get中止而不是让我选择是或否。

我知道我可以通过该选项来解决这个问题-y,但我想知道为什么会发生这种情况以及如何保留交互式选择。

答案1

xargs -a packages sudo apt-get remove

将直接xargs从 读取参数packages,因此它将使 stdin 不受干扰。

答案2

更通用的解决方案是

 sudo apt-get remove `cat packages`

如果列表中你会遇到问题包裹真的很长

它不起作用的原因是 apt-get 试图从标准输入中读取您的确认,该输入(由于管道的原因)附加到cat.相反,sudo直接打开 /dev/tty 询问密码是正确的做法。 Apt 应该这样做,但显然没有。

答案3

由于apt-get正在删除多个包,因此必须确认该操作。由于它是STDIN从管道读取并且未连接到终端,因此它会自动假定No

解决这个问题的另一种方法是添加APT::Get::Assume-Yesapt.conf.

答案4

解决办法。

使用 GNU xargs 和 ksh/zsh/bash:

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

(当然,如果命令只是cat,那么你可以替换<(cat packages)packages.

或者:

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

根据“packages”文件的格式(xargs 需要一个以空格分隔的参数列表并处理引号(和"),而不处理引号并扩展通配模式),您还可以执行以下操作:'\$(...)

sudo apt-get remove $(cat packages)

但请注意,许多操作系统对命令行的长度有限制,因此如果列表很大,则可能不起作用(但xargs可以通过运行多个命令来解决该问题apt-get)。

相关内容