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
program
mati (gunakanwait
untuk menunggunya) program
akan berakhir (dapatkaneof
pada stdinnya jika shell keluar).