为什么xargs传递给subshel​​l时会跳过第一个参数?


8

寻找一种在xargs单行代码中调用多个命令的方法,我在findutils中找到了从xargs调用shell的建议,如下所示:

$ find ... | xargs sh -c 'command $@'

有趣的是,如果我这样使用xargs,由于某种原因,它会跳过第一个参数:

$ seq 10 | xargs bash -c 'echo $@'
2 3 4 5 6 7 8 9 10
$ seq 10 | xargs -n2 bash -c 'echo $@'
2
4
6
8
10

我的shell或xargs版本有问题吗?该文件不准确吗?

使用xargs(GNU findutils)4.4.2GNU bash,版本4.3.11(1)-release

Answers:


13

[bash]手册页说:“ -c string如果存在-c选项,则从字符串中读取命令。如果在字符串之后有参数,则将它们分配给位置参数,从$ 0开始。 ”-密钥为$ 0 ; 这意味着命令名称应为第一个参数。

seq 10 | xargs sh -c 'echo $@; echo $0' sh
1 2 3 4 5 6 7 8 9 10
sh

哦,我明白了!这就是为什么文档move在示例中将其放在最后!我应该仔细阅读...谢谢!=)
elias 2015年

11

为什么xargs传递给subshel​​l时会跳过第一个参数?

没有。Bash将第一个参数分配给$ 0:

$ seq 10 | xargs -n2 bash -c 'echo $0'
1
3
5
7
9

$@扩展为$1 $2 $3...。因此,的值$0不包含在中$@


这个解释比@Janis的解释清楚得多,但是Janis的答案包括一个很好的解决方案。
亚历克西斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.