Asumsikan saya memiliki pipa berikut:
a | b | c | d
Bagaimana saya bisa menunggu selesainya c
(atau b
) di sh
atau bash
? Ini berarti bahwa skrip d
dapat mulai kapan saja (dan tidak perlu ditunggu-tunggu) tetapi membutuhkan hasil lengkap c
untuk bekerja dengan benar.
Case use adalah difftool
untuk git
yang membandingkan gambar. Ini dipanggil oleh git
dan perlu memproses inputnya ( a | b | c
bagian) dan menampilkan hasil perbandingan ( d
bagian). Penelepon akan menghapus input yang diperlukan untuk a
dan b
. Ini berarti bahwa sebelum kembali dari skrip, proses c
(atau b
) harus diakhiri. Di sisi lain, saya tidak bisa menunggu d
karena ini berarti saya sedang menunggu input pengguna.
Saya tahu saya bisa menulis hasil c
ke file sementara, atau mungkin menggunakan FIFO di bash
. (Namun, tidak yakin apakah FIFO akan membantu.) Apakah mungkin untuk mencapai ini tanpa file sementara sh
?
EDIT
Mungkin akan cukup jika saya bisa mengetahui ID proses dari c
(atau b
) proses dengan cara yang dapat diandalkan. Kemudian seluruh pipa dapat dimulai secara tidak sinkron, dan saya bisa menunggu proses ID. Sesuatu di sepanjang garis
wait $(a | b | { c & [print PID of c] ; } | d)
EDIT ^ 2
Saya telah menemukan solusi, komentar (atau solusi yang masih lebih baik) dipersilakan.
d
gratis untuk memulai kapan saja suka, tetapi c
harus selesai sebelum saya bisa melanjutkan.
d
bisa dimulai ketika suka, apa yang sebenarnya Anda tunggu?
d
tidak menggunakan output c
maka sepertinya tidak masuk akal untuk membuat d
bagian dari pipa. Tetapi jika d
memang menggunakan input maka d
harus bekerja sebentar pada inputnya setelah membaca semua itu agar pendekatan Anda membuat perbedaan.
d
mulai memprosesc
output hanya setelahc
selesai? Anda tidak ingind
mulai memproses setiap jalur keluaran saat datang?