web-dev-qa-db-ja.com

xargsを使用するときに引数の代わりに標準入力にリダイレクトする

たとえば、次のコマンドを使用します

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

foo.txtには2行が含まれています

foo
bar

上記のコマンドは何も出力しません。

12
Ryan
cat foo.txt | xargs -J % -n 1 sh -c "echo % | bar.sh" 

トリッキーな部分は、xargsが暗黙のサブシェル呼び出しを実行することです。ここでは明示的に呼び出され、パイプは親コンベアの一部にはなりません

6
Kondybas

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     
2
Matteo