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
mulai memprosesc
output hanya setelahc
selesai? Anda tidak ingind
mulai memproses setiap jalur keluaran saat datang?d
gratis untuk memulai kapan saja suka, tetapic
harus selesai sebelum saya bisa melanjutkan.d
bisa dimulai ketika suka, apa yang sebenarnya Anda tunggu?d
tidak menggunakan outputc
maka sepertinya tidak masuk akal untuk membuatd
bagian dari pipa. Tetapi jikad
memang menggunakan input makad
harus bekerja sebentar pada inputnya setelah membaca semua itu agar pendekatan Anda membuat perbedaan.Jawaban:
Pemberitahuan dapat dilakukan misalnya dengan sinyal ke PID yang telah diteruskan dalam variabel lingkungan (
kill -USR1 $EXTPID
) atau dengan membuat file (touch /path/to/file
).Ide lain:
Anda menjalankan proses selanjutnya (yang dapat memulai yang Anda tunggu) dari pipa:
atau
sumber
notify
dapat dieksekusi sebelum saya memasang perangkap sinyal. Bagaimana saya bisa memastikan untuk tidak melewatkan sinyal itu?trap
telah ditentukan.{ c; bg; }
atau{ c; exit 0; }
sepertinya tidak berhasil.Jika saya memahami pertanyaan Anda dengan benar, ini akan berhasil:
(Trik fd 3 adalah karena beberapa (kebanyakan) shell mengarahkan stdin ke / dev / null with
&
).sumber
Di bash, Anda dapat menggunakan proses substitusi . Perintah dalam proses substitusi berjalan secara tidak sinkron, tidak ditunggu.
sumber
bash
hanya, benar - tidak adash
dukungan?Inilah yang saya temukan dengan coba-coba, dengan bantuan masukan Hauke:
Setara:
(Yang terakhir lebih eksplisit, karena
{}
akan berjalan dalam subkulit pula jika di dalam pipa.)Beberapa sinyal lain (termasuk
QUIT
,TERM
danUSR1
) berfungsi juga, namun dalam hal ini deskripsi sinyal ditampilkan pada terminal.Saya ingin tahu apakah ini maksud asli dari
PIPE
sinyal. Menurut manual :Ini berarti bahwa ketika saya secara artifisial mengirim sinyal pipa ke subkulit, itu diam-diam berakhir, meninggalkan konsumen akhir (
d
) sendirian.Ini bekerja di kedua
sh
danbash
.sumber
Anda dapat menggunakan
sponge
program dari paket "moreutils":a | b | c | sponge | d
spons akan digunakan untuk akhir
c
keluaran sebelum disalurkan ked
. Semoga itu yang Anda inginkan.sumber
Anda bisa melakukannya:
Jadi, ketika
d
selesai,cat
akan menyerap sisac
output sampai selesai.Baik. Setelah komentar, saya pikir jawabannya adalah langsung mulai
d
di latar belakang.Melakukan:
atau gunakan solusi Stephane Chazelas jika ada masalah dengan
d
membaca dari stdin .sumber
c
selesai lebih awal darid
, dan saya harus menunggu sampaic
selesai tetapi tidak pedulid
.c
selesai dand
masih berjalan? Bunuhd
?d
memiliki GUI dan dapat berjalan hingga pengguna menutupnya.a
,,b
danc
menyelesaikan pekerjaan mereka, mereka menutup stdout dan keluar; dan hanyad
tetap berjalan. Apakah Anda ingin mengirimd
ke latar belakang saatc
selesai? Itu saja?d
harus dikirim ke latar belakang setelahc
selesai.