我希望能够用于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
...等等
这可以实现吗?我怀疑我对的多次使用-I
是不正确的。
我希望能够用于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
...等等
这可以实现吗?我怀疑我对的多次使用-I
是不正确的。
Answers:
我相信您不能使用-I
这种方式。但是您可以通过以下方式获得所需的效果/行为:
echo {1..8} | xargs -n2 sh -c 'echo "the number $1 comes before $2"' sh
本质上,这将创建一个临时的单行shell脚本,该xargs
脚本通过执行sh -c
。xargs
从输入中解析出的两个值将传递到此“脚本”。然后,shell将这些值分配给$1
和$2
,然后可以在“脚本”中引用这些值。
sh
。最后sh
的结尾是要放入的内容$0
。 $0
通常包含解释器或脚本名称的内容。
sh
与echo $sh
它的工作原理。所以最终sh
功能是占位符
对于的特定情况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
到xargs
防范的是,其中1000是偶数,应该是足够小,以免到达参数列表太长限制和足够大,以避免运行这么多printf
秒。
请注意,每次调用都将在一个单独的新进程中进行,而xargs
不是shell的buildin printf
进行外部printf
调用。
还要注意,对于空输入,除了在某些BSD上,它仍将printf
不带参数运行一次。GNU xargs
和compatible具有-r
(或--no-run-if-empty
)选项来避免这种情况。
明确地说,这个简单的答案是特定于您的printf
示例的,并且在通常必须一次将两个参数传递给命令的情况下diff
(例如,对于)来说是不起作用的。要解决的一般问题zsh
,可以使用:
for i j ({1..8}) echo "the number $i comes before $j"
zsh
上面的部分是一个真实的答案,xargs
-with-no-options部分只是一个奇怪的例子。在这种情况下,我将考虑把真正的答案放在首位。(2)我假设您有理由不在zsh
命令中使用引号。如果是这样,您可能要声明一下,以免人们阅读上面的内容并开始认为引用并不重要。(或者简单地包括它们,因为它们不会造成伤害。)
awk -F'\t' '/match/{printf $1"\0"$2"\0"}' | xargs -0 printf -- '-args1 "%s" -args2 "%s"' | xargs mycommand
-0
在第一个xargs
使它更可靠的用法被击败,因为您没有在第二个使用它。此外,第一个参数printf
(包括独立的效用和awk
的printf()
函数)的格式,你不应该使用变量存在。在这里,您可以做awk -F'\t' '/match/{printf "-args1\0%s\0-args2\0%s\0", $1, $2}' | xargs -n400 -r0 mycommand
。同样,-n400
需要确保xargs
传递的参数是4的倍数。(请注意,并非所有awk
实现都支持使用\0
此处的参数)。
-0
使它更可靠,而是用它来做我想做的事。
尝试这个:
echo {1..8} |xargs -n 2 bash -c 'echo "the number $0 comes before $1"'
sh -c
使用sh
(或其他任何方式)运行脚本$0
。请注意,如果脚本要使用它$0
,则不包括在内,例如,脚本是$@
sh -c
echo "the two numbers were $@"