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
来实现这一目标。
如果您想将一定数量的行作为参数传递给command
via 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
在构建命令行时添加到命令行中的任何参数,它们都会出现在command
so 的初始参数之后,例如
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
您可以做的是调用sh
ell 来运行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 不是位置参数?$@
xargs
bang
0
command_name
sh
请注意,我的帖子涉及 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)