xargs 将多行视为单个命令调用的参数

inf*_*ged 5 bash xargs command

我很难打印一个数字序列,然后在末尾添加一些内容。

seq 1 3 | xargs -I {} echo {} 4
Run Code Online (Sandbox Code Playgroud)

结果是

1 4
2 4
3 4
Run Code Online (Sandbox Code Playgroud)

不过我希望结果是

1 2 3 4
Run Code Online (Sandbox Code Playgroud)

由于我正在学习xargs,我只想用它xargs来实现这一目标。

don*_*sti 5

如果您想将一定数量的行作为参数传递给commandvia GNU的单次调用xargs,您可以运行如下命令:

multi-line cmd | xargs -d '\n' -n N command
Run Code Online (Sandbox Code Playgroud)

即用作\n分隔符并一次传递第 1N行,这相当于运行command

command line1 line2 ... lineN  
Run Code Online (Sandbox Code Playgroud)

现在,xargs操作如下:

input | xargs [options] [command [initial-arguments]]
Run Code Online (Sandbox Code Playgroud)

这意味着xargs在构建命令行时添加到命令行中的任何参数,它们都会出现在commandso 的初始参数之后,例如

multi-line cmd | xargs -d '\n' -n N command initial-args
Run Code Online (Sandbox Code Playgroud)

将执行

command initial-args line1 line2 ... lineN  
Run Code Online (Sandbox Code Playgroud)

这就是为什么你无法运行

seq 1 3 | xargs -d '\n' -n 3 echo 4
Run Code Online (Sandbox Code Playgroud)

并获得预期的输出,因为4将被视为初始参数,最终结果将是

4 1 2 3

您可以做的是调用shell 来运行command- 这将使您能够在末尾放置任何其他参数:

seq 1 3 | xargs -d '\n' -n 3 sh -c 'echo "$@" 4' bang
Run Code Online (Sandbox Code Playgroud)
1 2 3 4

bang上面一行字里写的是什么?sh -c 语法

sh -c command_string [command_name [argument...]]
Run Code Online (Sandbox Code Playgroud)

所以 'echo "$@" 4'(扩展为位置参数,在本例中是由) 添加的参数,并且是特殊参数,(您可以使用任何名称,例如) 值得一读:为command_string​​么 $0 不是位置参数?$@xargsbang0command_namesh


请注意,我的帖子涉及 GNUxargs及其专有-d开关。或者,您可以在 shell 中执行此操作,将输出行保存到数组中并将其元素作为参数传递到command任何其他参数之前,
例如bash

readarray -t args < <(multi-line cmd)
command "${args[@]}" additional-arg(s)
Run Code Online (Sandbox Code Playgroud)

或与zsh

args=("${(@f)$(multi-line cmd)}")
command "${args[@]}" additional-arg(s)
Run Code Online (Sandbox Code Playgroud)

1:假设这些N线在ARG_MAX限制范围内


小智 1

xargs 部分很好。seq 可以像这样使用分隔符

seq -s ' ' 1 3 | xargs -I {} echo {} 4
Run Code Online (Sandbox Code Playgroud)