Saya memiliki program yang menghasilkan informasi berguna tentang stdout tetapi juga membaca dari stdin . Saya ingin mengarahkan output standarnya ke file tanpa memberikan apa pun pada input standar. Sejauh ini, sangat bagus:Saya bisa:
program > output
dan jangan lakukan apa pun di tty.
Namun, masalahnya adalah saya ingin melakukan ini di latar belakang. Jika saya melakukannya:
program > output &
program akan ditangguhkan ("ditangguhkan (masukan tty)").
Jika saya melakukannya:
program < /dev/null > output &
program segera dihentikan karena mencapai EOF.
Tampaknya yang saya butuhkan adalah menyalurkan ke program sesuatu yang tidak melakukan apa pun untuk waktu yang tidak terbatas dan tidak membaca stdin . Pendekatan berikut berhasil:
while true; do sleep 100; done | program > output &
mkfifo fifo && cat fifo | program > output &
tail -f /dev/null | program > output &
Namun, ini semua sangat jelek. Ada telah untuk menjadi cara yang elegan, menggunakan utilitas Unix standar, untuk "tidak melakukan apa-apa, tanpa batas" (untuk memparafrasekan man true ). Bagaimana saya bisa mencapai ini? (Kriteria utama saya untuk keanggunan di sini:tidak ada file sementara; tidak ada kesibukan menunggu atau bangun berkala; tidak ada utilitas eksotis; sesingkat mungkin.)
Jawaban yang Diterima:
Di shell yang mendukungnya (ksh, zsh, bash4), Anda dapat memulai program sebagai proses bersama.
ksh:program > output |&zsh,bash:coproc program > output
Itu memulai program di latar belakang dengan inputnya dialihkan dari pipe . Ujung pipa yang lain terbuka ke cangkangnya.
Tiga manfaat dari pendekatan itu
- tidak ada proses tambahan
- Anda dapat keluar dari skrip saat
programmati (gunakanwaituntuk menunggunya) programakan berakhir (dapatkaneofpada stdinnya jika shell keluar).