例えば、コマンド
cat foo.txt | xargs -I{} -n 1 -P 1 sh -c "echo {} | echo"
foo.txt
2行が含まれています
foo
bar
上記のコマンドは何も出力しません。
答え1
cat foo.txt | xargs -J % -n 1 sh -c "echo % | bar.sh"
難しいのは、xargsが暗黙的にサブシェル呼び出しを実行することです。ここではshが明示的に呼び出され、パイプは親コンベアの一部にはなりません。
答え2
foo.txtのすべての行を処理したい場合は、ループを使用する必要があります。 を使用すると、&
プロセスをバックグラウンドで実行できます。
while read line; do
echo $line | bar.sh &
done < foo.txt
入力にスペースが含まれている場合は、一時的に内部フィールドセパレータを改行に設定します。
# save the field separator
OLD_IFS=$IFS
# new field separator, the end of line
IFS=$'\n'
for line in $(cat foo.txt) ; do
echo $line | bar.sh &
done
# restore default field separator
IFS=$OLD_IFS