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.


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.


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;
)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.