我希望能够xargs
在命令的不同部分执行多个参数。
例如,以下内容:
echo {1..8} | xargs -n2 | xargs -I v1 -I v2 echo the number v1 comes before v2
Run Code Online (Sandbox Code Playgroud)
我希望它会回来
the number 1 comes before 2
the number 3 comes before 4
Run Code Online (Sandbox Code Playgroud)
... 等等
这是可以实现的吗?我怀疑我的多次使用-I
是不正确的。
Sco*_*ott 43
我相信你不能这样使用-I
。但是你可以通过说你想要的效果?/?行为:
echo {1..8} | xargs -n2 sh -c 'echo "the number $1 comes before $2"' sh
Run Code Online (Sandbox Code Playgroud)
这实质上创建了一个临时的单行 shell 脚本,该xargs
脚本通过sh -c
. xargs
从输入中解析出来的两个值被传递给这个“脚本”。然后外壳将这些值分配给$1
和$2
,然后您可以在“脚本”中引用它们。
在 的特定情况下printf
,您始终可以执行以下操作:
echo {1..8} | xargs printf 'the number %s comes before %s\n'
Run Code Online (Sandbox Code Playgroud)
因为如果给定的参数多于单次调用所需的参数,则它具有类似printf
内在xargs
的能力,可以多次执行。虽然这没有什么优势
printf 'the number %s comes before %s\n' {1..8}
Run Code Online (Sandbox Code Playgroud)
对于大型列表,简单的xargs
命令可能会导致xargs
运行多个 实例printf
,其中一些可能具有奇数个参数。您可以传递-n 1000
到xargs
以防止出现这种情况,其中 1000 是一个偶数,它应该足够小,以免达到arg 列表过长的限制,并且足够大以避免运行如此多的printf
s。
请注意,每次调用都在一个单独的新进程中xargs
调用,而不是您的 shell 的 builtin printf
,而是 external printf
。
还要注意,对于空输入,除了在某些 BSD 上,它仍然会printf
在没有参数的情况下运行一次。GNUxargs
和 compatible 有一个-r
(或--no-run-if-empty
)选项来避免这种情况。
需要明确的是,这个简单的答案特定于您的printf
示例,并且在您必须一次向命令传递两个参数的一般情况下不起作用(例如,就属于这种情况diff
)。要使用 解决一般问题zsh
,您可以使用:
for i j ({1..8}) echo "the number $i comes before $j"
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
28653 次 |
最近记录: |