通过 xargs 传递多个参数

通过 xargs 传递多个参数

我希望能够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 1000toxargs来防止这种情况,其中 1000 是一个偶数,它应该足够小,以免达到arg 列表太长limit 并且足够大以避免运行这么多printfs。

请注意,这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"'

相关内容