Saya memiliki program yang keluar secara otomatis setelah membaca EOF dalam aliran yang diberikan (dalam kasus berikut, stdin).
Sekarang saya ingin membuat skrip shell, yang membuat pipa bernama dan menghubungkan stdin program ke sana. Kemudian skrip menulis ke pipa beberapa kali menggunakan echo
dan cat
(dan alat-alat lain yang secara otomatis menghasilkan EOF ketika mereka keluar). Masalah yang saya hadapi adalah, ketika yang pertama echo
dilakukan, ia mengirim EOF ke pipa dan membuat program keluar. Jika saya menggunakan sesuatu seperti itu tail -f
maka saya tidak dapat mengirim EOF ketika saya bermaksud untuk keluar dari program. Saya sedang mencari solusi yang seimbang tetapi tidak berhasil.
Saya sudah menemukan cara mencegah EOF dan cara mengirim EOF secara manual tetapi saya tidak bisa menggabungkannya. Apakah ada petunjuk?
#!/bin/sh
mkfifo P
program < P & : # Run in background
# < P tail -n +1 -f | program
echo some stuff > P # Prevent EOF?
cat more_stuff.txt > P # Prevent EOF?
send_eof > P # How can I do this?
# fg
exec 3>P
sebab ini bertahanlah, mengapa?exec 2>P
, dan Anda memiliki mode jejak dihidupkan (set -x
), di mana bash akan menulis ke pipa, tetapi tidak ada pembaca sehingga memblokir menunggu sesuatu untuk dibaca.exec 3>P
hang bash di komputer saya juga. Ini karena tidak ada proses membaca dariP
. Jadi, solusinya adalah dengan menukar garisexec 3>P
danprogram < P &
(menambahkan ampersand sehingga program berjalan di latar belakang).Sebuah pipa menerima EOF ketika penulis terakhir pergi. Untuk menghindarinya, pastikan selalu ada penulis (proses yang membuat pipa terbuka untuk menulis, tetapi sebenarnya tidak menulis apa pun). Untuk mengirim EOF, buat penulis cadangan itu pergi.
sumber
Tidak ada cara bagi program untuk membedakan antara EOF yang berarti "saatnya untuk berhenti" dan EOF yang berarti "seorang penulis selesai, tetapi mungkin ada lebih banyak masukan dari orang lain".
Jika Anda memiliki kemampuan untuk mengubah perilaku program Anda, maka lakukan pembacaan dalam loop yang tak terbatas (satu iterasi berlangsung hingga EOF) dan mengirimkannya string perintah khusus yang berarti "waktu untuk berhenti". Mengirim string itu akan menjadi tugas
send_eof
perintah dalam pertanyaan Anda.Pilihan lain:
atau
sumber