GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana Tidak Melakukan Apa-apa Selamanya Dengan Cara yang Elegan?

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 (gunakan wait untuk menunggunya)
  • program akan berakhir (dapatkan eof pada stdinnya jika shell keluar).

Linux
  1. Cara Menyimpan Output Perintah ke File di Linux

  2. Bagaimana Mengurutkan Du Output Berdasarkan Ukuran?

  3. Bagaimana Cara Mengarahkan Output Program Ke File Zip??

  1. Bagaimana Suatu Program Memutuskan Apakah Memiliki Output Berwarna atau Tidak?

  2. Bagaimana Membuat Program Apa Pun Bekerja Dengan Perintah Tee?

  3. Menutup Output Standar (>&-)?

  1. Cara Menetapkan Output dari Perintah Linux ke Variabel

  2. Cara mengarahkan output program sebagai inputnya

  3. tcpdump:bagaimana cara mendapatkan keluaran grepable?