xargsがサブシェルに渡されたときに最初の引数をスキップするのはなぜですか?

xargsがサブシェルに渡されたときに最初の引数をスキップするのはなぜですか?

xargsを使って1行に複数のコマンドを呼び出す方法を見つけました。findutilsでは、xargsからシェルを呼び出すことをお勧めします。このように:

$ 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

私のシェルまたはxargsのバージョンに問題がありますか?文書が不正確ですか?

使用xargs(GNU findutils) 4.4.2そしてGNU bash、バージョン4.3.11(1) - リリース

ベストアンサー1

[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

おすすめ記事