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


12

たとえば、コマンドを使用して

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

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

foo
bar

上記のコマンドは何も印刷しません。

回答:


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

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


1
おかげで、より具体的な例を提供するために質問を更新しました。あなたが示唆したように、それは...動作しません
ライアン

1
エコーは標準入力から読み取ることができないため、パイプを使用しても意味がありません。これを比較しますcat foo.bar | wc -lcat foo.bar | xargs -J % -n 1 sh -c "echo % | wc -l"
Kondybas

1
-I代わりにあなたが意味すると思う-J; -Jxargs にはオプションがありません
-Hitechcomputergeek

@Hitechcomputergeek FreeBSDのバージョンのLinuxに相当するxargshave -Jオプション-ixargs
-Kondybas

@Kondybas教えてくれてありがとう。この2つの間に違いがあることは知りませんでした。GNUがPOSIX lolに従わないと信じることができます。(-JPOSIXでは定義されていません-Iが、GNUとは異なる用途があります。)
Hitechcomputergeek

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     

いいえ、私もそれにこだわっています。TSは、別々の行にファイルを分割したいと独立してスクリプトにそれらを養う
Kondybas

1
私は、プロセスを並列xargsのを使用する必要があります...
ライアン

OK :-) xargs使用したOP のオプションを調べました。
マッテオ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.