xargs を使用するときに引数ではなく stdin にリダイレクトする

xargs を使用するときに引数ではなく stdin にリダイレクトする

例えば、コマンド

cat foo.txt | xargs -I{} -n 1 -P 1 sh -c "echo {} | echo"

foo.txt2行が含まれています

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     

関連情報