Answers:
一个更通用的解决方案是
sudo apt-get remove `cat packages`
它不起作用的原因是apt-get试图从标准输入中读取您的确认,由于管道,该输入被附加到cat
。相反,sudo
通过直接打开/ dev / tty来询问您的密码来做正确的事。Apt应该这样做,但显然不应该这样做。
cat
,但是xargs启动的进程的标准输入来自/ dev / null。这是xargs的行为。简单演示:echo "" | xargs ls -l /dev/self/fd
apt-get
不应该打开/dev/tty
。否则,您将无法做类似的事情yes | apt-get
。密码几乎是唯一/dev/tty
可以正确读取内容的情况,即使这样也值得商bat。
--arg-file
对于特定情况,依法美敏对选项的使用甚至更好,这就是为什么我赞成使用该选项。对于许多没有这种选项的命令,backtick-cat隐喻仍然有其用途。
变通。
使用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
命令可以解决此问题)。
sudo xargs --arg-file packages apt-get remove
吗?