我希望能够xargs
在命令的不同部分执行多个参数。
例如,以下内容:
echo {1..8} | xargs -n2 | xargs -I v1 -I v2 echo the number v1 comes before v2
我希望它能回来
the number 1 comes before 2
the number 3 comes before 4
... ETC
这是可以实现的吗?我怀疑我的多次使用-I
是不正确的。
答案1
我相信你不能用-I
这种方式。但是你可以通过说以下内容来获得你想要的效果/行为:
echo {1..8} | xargs -n2 sh -c 'echo "the number $1 comes before $2"' sh
这本质上创建了一个特别指定一行 shell 脚本,xargs
通过sh -c
.xargs
从输入中解析出来的两个值被传递给这个“脚本”。然后 shell 将这些值分配给$1
和$2
,然后您可以在“脚本”中引用它们。
答案2
在 的具体情况下printf
,您始终可以这样做:
echo {1..8} | xargs printf 'the number %s comes before %s\n'
因为如果给定的参数多于单次调用所需的参数,则printf
具有类似内在的多次执行能力。xargs
虽然这比
printf 'the number %s comes before %s\n' {1..8}
对于大型列表,简单的xargs
命令可能会导致xargs
运行多个实例printf
,其中一些实例可能具有奇数个参数。您可以传递-n 1000
toxargs
来防止这种情况,其中 1000 是一个偶数,它应该足够小,以免达到arg 列表太长limit 并且足够大以避免运行这么多printf
s。
请注意,这xargs
将调用的不是 shell 的builtin printf
,而是 external printf
,每次调用都在一个单独的新进程中。
另请注意,对于空输入,除了某些 BSD 之外,它仍然会printf
在不带参数的情况下运行一次。 GNUxargs
和兼容版本有一个-r
(或--no-run-if-empty
) 选项来避免这种情况。
需要明确的是,这个简单的答案特定于您的printf
示例,并且在您必须一次向命令传递两个参数的一般情况下不起作用(例如 的情况diff
)。要解决 的一般问题zsh
,您可以使用:
for i j ({1..8}) echo "the number $i comes before $j"
答案3
尝试这个:
echo {1..8} |xargs -n 2 bash -c 'echo "the number $0 comes before $1"'