web-dev-qa-db-ja.com

xargsでスペース区切りの環境変数を処理する方法

長時間実行されているプロセスを複数回並行して実行しようとしています。プロセスの各実行のパラメーターは、スペースで区切られた環境変数に格納されます。これが私が実行しようとしているものの不自然な例です:

$ echo -e 1 2 3 4 | xargs --max-procs=3 --max-args=1 --replace=% echo % is the number being processed

そのコマンドの出力は次のとおりです。

1 2 3 4 is the number being processed

Max-argsが無視されているように見えるのはなぜですか?次に、より良い結果が得られる区切り文字を明示的に設定しようとしました。

$ echo -e 1 2 3 4 | xargs -d " " --max-procs=3 --max-args=1 --replace=% echo % is the number being processed
1 is the number being processed
2 is the number being processed
3 is the number being processed
4
 is the number being processed

4番目の引数を処理するときにxargsは何をしていますか?

いくつか検索した後、私はほとんど私が欲しいものを手に入れることができました。引数は正しく処理されますが、並列処理は機能しません(ここに示されていない別のコマンドで確認されます)。

$ echo -e 1 2 3 4 | xargs -n 1 | xargs --max-procs=3 --max-args=1 --replace=% echo % is the number being processed
1 is the number being processed
2 is the number being processed
3 is the number being processed
4 is the number being processed

何が足りないのですか?

2
gordo911

しますか

echo -e 1 2 3 4 | sed -e 's/\s\+/\n/g' | xargs --max-procs=3 --max-args=1 --replace=% echo % is the number being processed

タスクを達成しますか?出力はほぼ正しいようです:

1 is the number being processed
2 is the number being processed
3 is the number being processed
4 is the number being processed

また、echosleepに置き換えて、並行して実行されることを確認しました。

echo -e 1 2 3 4 5 6 7 8 9 9 9 9 9 9 9 9 9 9 9 9 | sed -e 's/\s\+/\n/g' | xargs --max-procs=20 --max-args=1 --replace=% sleep 1
1
dusty

-n-max-argsを使用した、他のいくつかの方法、おそらくもっと簡単な方法:

echo -n "foo bar baz" | tr ' ' '\n' | xargs -n 1 echo    # With \n, no need for -0
echo -n "foo bar baz" | tr ' ' '\0' | xargs -0 -n 1 echo # Using null character
echo -n "foo bar baz" | xargs -d ' ' -n 1 echo           # Telling to xargs the delimiter
  • もちろん、echoは任意のコマンドにすることができます。
  • -Lパラメーターおよび-d '\n'(スペースを含む行の場合)も参照してください。
  • プロセスは--max-procsと並行して勝ちますが、 parallel の方が良いかもしれません。
0
Pablo A