我尝试使用xargs
执行以下操作 pacman -Q | grep xf86-video | awk '{print $1}' | xargs pacman -R
删除我机器上的所有xf86-video- *驱动程序。为了使问题更加清晰,以下是pacman -Q | grep xf86-video | awk '{print $1}'
:
xf86-video-ark
xf86-video-ati
xf86-video-dummy
xf86-video-fbdev
xf86-video-glint
xf86-video-i128
xf86-video-intel
xf86-video-mach64
xf86-video-neomagic
xf86-video-nouveau
....
当我将结果重定向到xargs
时,输出如下所示:
关键是,xargs
即将执行的命令需要用户执行一些附加输入(因为您可以看到它需要是/否),但是{{1 自动添加未知符号 # ,然后退出,这会导致我的目的未获得成就。
为什么xargs
会执行此操作,或者如何使用xargs
来执行带有提示的命令?
答案 0 :(得分:4)
您可以使用
xargs -a <(pacman -Q | awk '/xf86-video/{print $1}') pacman -R
没有进一步的参数xargs
不适用于交互式(命令行)应用程序。
原因是,默认情况下xargs
从 stdin 获取输入,但交互式应用程序也希望从 stdin 输入。为防止应用程序获取xargs
的输入,xargs
从/dev/null
重定向 stdin 以运行它的应用程序。这导致应用程序只接收 EOF 。 (仅运行pacman -R SOMEPACKAGE
并按 Ctrl + D 具有相同的效果)。
要让xargs
使用交互式命令,您必须使用--arg-file=FILE
参数(简称-a FILE
)。这告诉xargs
从FILE
获取参数。这也使 stdin 保持不变。
因此,您可以将包列表放入临时文件
pacman -Q | awk '/xf86-video/{print $1}' > /tmp/packagelist
xargs -a /tmp/packagelist pacman -R
rm /tmp/packagelist
或者您可以使用 zsh&#39> 进程替换机制<(list)
。使用<(list)
执行行时,<(list)
将替换为可以读取list
输出的文件名。
xargs -a <(pacman -Q | awk '/xf86-video/{print $1}') pacman -R
您获得的单个#不是来自xargs
,而是来自zsh
本身。如果设置了shell选项PROMPT_CR
和PROMPT_SP
(默认情况下都是这两个选项),zsh
会尝试保留部分行,即不以换行符结尾的行。为表示此类行已被保留,zsh会在该行的末尾打印一个反+粗体字符,默认情况下%表示普通用户,#表示root用户。
答案 1 :(得分:1)
您需要使用--noconfirm
选项第二次运行pacman:
pacman -Q | grep xf86-video | awk '{print $1}' | xargs pacman -R --noconfirm
这将禁用“您确定”的消息,并且无需输入即可执行操作。