Redirect ke stdin alih-alih argumen saat menggunakan xargs [ditutup]

12

untuk exmaple, gunakan perintah

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

The foo.txtberisi dua baris

foo
bar

Perintah di atas tidak mencetak apa pun.

Ryan
sumber

Jawaban:

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

Bagian yang sulit adalah bahwa xargs melakukan pemanggilan subkulit implisit. Di sini dia dipanggil secara eksplisit dan pipa tidak menjadi bagian dari conveyor induk

Kondybas
sumber
1
Terima kasih, saya telah memperbarui pertanyaan saya untuk memberikan contoh yang lebih konkret. tetapi itu tidak berfungsi seperti yang Anda sarankan ..
Ryan
1
gema tidak bisa membaca dari stdin, jadi perpipaannya tidak masuk akal. bandingkan ini: cat foo.bar | wc -ldancat foo.bar | xargs -J % -n 1 sh -c "echo % | wc -l"
Kondybas
1
Saya pikir maksud Anda -Ialih-alih -J; tidak ada -Jpilihan untuk xargs
Hitechcomputergeek
@Hitechcomputergeek Versi FreeBSD xargsmemiliki -Jopsi yang setara dengan -ilinuxxargs
Kondybas
@Kondybas Terima kasih telah memberi tahu saya; Saya tidak menyadari bahwa ada perbedaan di antara keduanya. Anda bisa mempercayai GNU untuk tidak mengikuti POSIX lol. ( -Jtidak didefinisikan dalam POSIX tetapi -Iadalah dan memiliki penggunaan yang berbeda dari GNU.)
Hitechcomputergeek
2

Jika Anda ingin memproses semua baris foo.txt, Anda harus menggunakan loop. Gunakan &untuk menempatkan proses ke latar belakang

while read line; do
   echo $line | bar.sh &
done < foo.txt

Jika input Anda berisi spasi untuk sementara, setel pemisah bidang internal ke baris baru

# 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     
Matteo
sumber
Tidak-tidak, saya terjebak dengan itu juga. TS ingin membagi file menjadi baris-baris yang terpisah dan memasukkannya ke dalam skrip secara independen
Kondybas
1
Saya perlu menggunakan xargs untuk memparalelkan proses ..
Ryan
OK :-) Saya baru saja mencari opsi xargsOP yang digunakan.
Matteo