我正在尝试从文件中删除包列表。我正在使用以下命令:
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-Yes
到apt.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
)。