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


17

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

cat packages | xargs sudo apt-get remove

packages是我的文件,其中包含要删除的软件包列表。一切似乎都可以正常运行,但是apt-get中止而不是让我选择是或否。

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


当听起来根本不起作用时,它如何“运作良好”?文件中的条目是什么样的?你试过了sudo xargs --arg-file packages apt-get remove吗?
暂停,直到另行通知。

好吧,这是“可行的”,因为apt-get可以删除正确的软件包。就是说,--arg-file是我想要的。您可以回答,我会接受的。谢谢!
10年

Answers:


13
xargs -a packages sudo apt-get remove

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


10

一个更通用的解决方案是

 sudo apt-get remove `cat packages`

如果软件包列表真的很长,哪里会有问题。

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


xargs的标准输入连接到的管道cat,但是xargs启动的进程的标准输入来自/ dev / null。这是xargs的行为。简单演示:echo "" | xargs ls -l /dev/self/fd
朱利安诺

1
@mws:不,apt-get不应该打开/dev/tty。否则,您将无法做类似的事情yes | apt-get。密码几乎是唯一/dev/tty可以正确读取内容的情况,即使这样也值得商bat。
吉尔斯(Gilles)“所以,别再邪恶了”,2010年

感谢您的评论,与我的拍打响回应一样,它们都是正确的和更好的思想,我将不做任何编辑,以便使评论仍然有意义。
msw

我知道了。这和xargs -a文件名之间有什么区别,就像ephemient所建议的那样?
Subb 2010年

是的,--arg-file对于特定情况,依法美敏对选项的使用甚至更好,这就是为什么我赞成使用该选项。对于许多没有这种选项的命令,backtick-cat隐喻仍然有其用途。
msw

2

由于apt-get要去除多个包装,因此必须确认动作。由于它是STDIN从管道读取的,并且未连接到终端,因此它会自动采用No

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


2

显然,xargs重定向STDIN,这会使apt-get假定它以非交互模式运行。

我可能会使用类似

sudo apt-get remove $(cat packages)

完全避免使用xargs。

(“ --arg-file”既不在apt-get(8)中,也不在我的活动词汇中)。


1

变通。

使用GNU xargs和ksh / zsh / bash:

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

(当然,如果命令为just cat,则可以替换<(cat packages)packages

要么:

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

根据不同的“套餐”文件的格式(xargs的期待的参数和工艺引号(一个空格分隔列表"'\),而$(...)不会处理引号和膨胀匹配模式),你也可以这样做:

sudo apt-get remove $(cat packages)

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


0

我可能是错的,但是您可以尝试一下,看看是否可行:

yes | sudo apt-get remove $(cat packages)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.