変数にはvar
複数の引数が含まれており、それぞれが新しい行で分割されています。
echo "$var" | xargs -I % echo ABC %
#Results in:
#ABC One
#ABC Two
#ABC Three
ただし、-I
文字を省略すると%
、次のようになります。
echo "$var" | xargs echo ABC
#Results in:
#ABC One Two Three
以前、{} が現在の引数の代わりになる (find のように) と読んだことがありますが、そうはなりません。何が間違っているのでしょうか?
答え1
の通常の動作は、xargs
実行するコマンドのコマンド ラインに可能な限り多くの引数を貼り付け、すべて完了するまで繰り返し実行することです。この方法で使用すると、コマンド ラインの長さ制限の問題が解決されます。
しかし、オプションを指定すると-I
、各引数に対してコマンドが実行されます個別に一度に 1 つずつ。Linuxxargs -I
オプションのドキュメントではそれが完全に明らかではないと思いますが、それが意味していることです。
-I replace-str
Replace occurrences of replace-str in the initial-arguments with
names read from standard input. Also, unquoted blanks do not
terminate input items; instead the separator is the newline
character. Implies -x and -L 1.
答え2
xargs の代わりに GNU Parallel を使用すると、必要な動作を制御できます。
# 1 line at a time
echo "$var" | parallel echo ABC {}
# Many lines at a time (divided by # cpu)
echo "$var" | parallel -X echo ABC {}
# Many lines at a time (not divided)
echo "$var" | parallel -Xj1 echo ABC {}
GNU Parallel のインストールには文字通り 10 秒しかかかりません。
wget pi.dk/3 -qO - | sh -x
詳細については、紹介ビデオをご覧ください。https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1