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
答え2
xargsがサブシェルに渡されたときに最初の引数をスキップするのはなぜですか?
しかし、実際にはそうではありません。 Bashは最初の引数を$ 0に割り当てます。
$ seq 10 | xargs -n2 bash -c 'echo $0'
1
3
5
7
9
$@
...に展開されます$1
$2
$3
。したがって、の値は$0
に含まれません$@
。