Saya ingin menelurkan dua proses anak, tetapi tunggu sampai yang pertama mencapai titik tertentu dalam pelaksanaannya (yang dapat ditentukan dengan memeriksa stdout) sebelum menelurkan yang kedua. Saya tidak yakin perintah unix mana yang akan terlibat dalam mencapai hal ini, dan mengalami kesulitan menemukan sesuatu melalui google karena sifat nama perintah unix yang singkat dan terkadang samar.
Saya tidak mencari solusi untuk masalah spesifik yang saya coba selesaikan (meskipun ada petunjuk tambahan akan dihargai), saya terutama khawatir dengan mengetahui perintah unix mana yang ingin saya cari dan pelajari untuk digunakan.
bash
bash-scripting
w.brian
sumber
sumber
Jawaban:
Anda dapat menggunakan
xargs
utilitas untuk ini. Ia dapat menjalankan perintah untuk setiap baris di stdin, jadi kita hanya perlu memastikan bahwaxargs
mendapat input satu baris pada stdin pada saat itu harus memulai perintah, yang dapat diselesaikan dengangrep
:Argumen
--max-count=1
,--max-lines=1
dan--no-run-if-empty
memastikan bahwaproc2
dimulai tepat sekali jika dan kapanproc1
keluaran${targetString}
untuk pertama kalinya, dan tidak pernah jikaproc1
tidak pernah keluaran${targetString}
. The--replace
Menghindari yangxargs
menambahkan garis input ke baris perintah.Saya menggunakan baris perintah berikut untuk mengujinya:
sumber
Saya tidak yakin ada perintah / jawaban yang elegan untuk pertanyaan yang Anda ajukan (yaitu mencapai titik tertentu dalam pelaksanaannya) - tetapi ada alat / teknik yang dapat digunakan untuk menyusun solusi, mungkin melibatkan lebih dari 1 dari berikut ini, dan mungkin hal-hal lain yang belum saya ketahui:
Menulis dan memeriksa file kunci juga merupakan praktik umum (tip pro - jika Anda memiliki kontrol lingkungan, tulis ke ramdisk daripada / tmp - pada banyak distro ini / dev / shm).
sumber
Ini hanya sebuah ide, tetapi proseskan dulu pipa keluarannya ke grep. Mintalah grep pipe hasilnya ke loop garis baca, dan bandingkan setiap baris dengan apa yang Anda cari. Setelah ditemukan, jalankan proc2.
Jika "titik tertentu dalam pelaksanaannya" dapat ditentukan olehstdout
, lalu bagaimana dengan yang berikut ini?proc1 | grep "stdout trigger string" && proc2
&&
harus menyala ketikagrep
kembali0
, yang hanya dilakukannya ketika menemukan kecocokan.sumber
proc2 &
dan kemudianbreak
, itu tidak akan terjadi, tetapi itu akan menutup pipa dan membuat proc1 berakhir sebelum waktunya. Atau, Anda dapat mengatur bendera setelah proc2 dimulai dan menggunakannya untuk memastikan proc2 tidak berjalan lagi. Seperti dengan jawaban yang lain, sisa output proc1 dibuang, jadi jika Anda membutuhkannya, lebih banyak pekerjaan diperlukan.|
dangrep
di sini).