我正在尝试使用xargs为每个提供的参数运行命令,但是不幸的是,当与-n共轭时,--replace / -I标志似乎无法正常工作。不论-n选项如何,{}似乎都会扩展到从stdin读取的参数的完整列表。
不幸的是,网络上的所有示例似乎都是针对命令(mv,cp,rm)的,这些命令将在展开{}的位置接受多个参数。
例如,运行时:
echo a b c d | xargs -n 1 -I {} echo derp {}
输出为:
derp a b c d
但我期望:
derp a
derp b
derp c
derp d
但是,在没有-I {}的情况下运行它会产生预期的结果:
echo a b c d | xargs -n 1 echo derp
derp a
derp b
derp c
derp d
有什么办法可以通过xargs实现这一目标吗?我的最终意图是使用它来运行多个(并行)ssh会话,例如
echo server{1..90} | xargs -n 1 -P 0 -I {} ssh {} 'echo $SOME_HOST_INFO'
我xargs (GNU findutils) 4.4.2
在RHEL 6.3上运行。
man xargs
on -I
:Also, unquoted blanks do not terminate input items; instead the separator is the newline character. Implies -x and -L 1.
因此其行为符合设计要求。
@André,由于您打算并行运行taks,因此您是否了解过GNU parallel?它做得很好。免责声明:我将其打包为Debian。
—
rbrito
GNU parallel似乎是一个很好的替代品,但是不幸的是我无法在特定的主机上安装它。
—
安德烈·费尔南德斯
@AndréFernandes如果您的理由不在oletange.blogspot.dk/2013/04/why-not-install-gnu-parallel.html
—
Ole Tange
xargs
,但不适用于GNUxargs
。