segera jalankan perintah untuk setiap baris stdin?

3

Bagaimana cara menjalankan perintah untuk setiap baris stdin segera?

Contoh :

(echo abc; sleep 10; echo def;) | ???

Itu xargs alat tidak melakukan pekerjaan karena itu blok sampai ia melihat semua data (menunggu stdout untuk menutup). Namun saya harus segera menjalankan perintah ketika baris baru tersedia.

VasyaNovikov
sumber
1
unix.stackexchange.com/questions/25372/… mungkin menarik untuk dibaca.
Hennes
@ Henry Terima kasih. Sayangnya, itu tidak membantu. Masalahnya bukan di pipa, tetapi bagaimana caranya xargs berfungsi (ia menunggu / memblokir sampai ia melihat semua input).
VasyaNovikov
1
Jadi, jangan gunakan xargs. Lewati keluaran yang tidak disalurkan melalui pipa dan di ujung lain pipa gunakan skrip shell untuk membaca baris sampai EOF.
Hennes
@ Hennes Saya sedang mencari utilitas baris perintah yang akan melakukan ini untuk saya.
VasyaNovikov
1
@ Hennes saya menulis contoh jawaban untuk memahami ide di balik komentar Anda.
VasyaNovikov

Jawaban:

2

Menggunakan GNU Parallel:

(echo abc; sleep 10; echo def;sleep 10; echo def;)|parallel -uj1

-u diperlukan untuk mendapatkan output segera. Tanpa perintah akan berjalan, tetapi output hanya akan dicetak nanti.

Pasukan -j1 menjalankan satu joblot tunggal. Meninggalkannya akan membuat GNU Parallel membaca n pekerjaan sebelum memulai, di mana n = jumlah inti.

Ole Tange
sumber
Wah, itu berhasil! Saya mencoba parallel -u echo, tetapi, seperti yang Anda katakan, -j1 itu perlu.
VasyaNovikov
1

Menggunakan skrip shell seperti yang disarankan oleh @Hennes:

long_running_command | (
  while read -r LINE; do
    echo $LINE;
    command_to_execute "$LINE";
  done;
)
VasyaNovikov
sumber