xargs:带提示符的exec命令

时间:2015-05-05 05:29:23

标签: redirect zsh xargs

我尝试使用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 result

关键是,xargs即将执行的命令需要用户执行一些附加输入(因为您可以看到它需要是/否),但是{{1 自动添加未知符号 ,然后退出,这会导致我的目的未获得成就。

为什么xargs会执行此操作,或者如何使用xargs来执行带有提示的命令?

2 个答案:

答案 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)。这告诉xargsFILE获取参数。这也使 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_CRPROMPT_SP(默认情况下都是这两个选项),zsh会尝试保留部分行,即不以换行符结尾的行。为表示此类行已被保留,zsh会在该行的末尾打印一个反+粗体字符,默认情况下表示普通用户,表示root用户。

答案 1 :(得分:1)

您需要使用--noconfirm选项第二次运行pacman:

pacman -Q | grep xf86-video | awk '{print $1}' | xargs pacman -R --noconfirm

这将禁用“您确定”的消息,并且无需输入即可执行操作。