jika saya ingin menampilkan "aaa" di layar:
(1)$: echo aaa | cat ... works OK
(2)$: echo aaa | ( cat ) ... works OK
(3)$: echo aaa | ( cat & ) ... NOT working
(4)$: ( echo aaa & ) | cat ... works OK
(5)$: echo aaa | ( cat <&0 & ) ... works ok in BASH (but not in SH)
(6)$: echo aaa | ( cat <&3 & ) 3<&0 ... works ok in BASH and SH
kesimpulan dari (3) dan (4) -> proses terlepas masih memiliki output yang terhubung yang dapat dikontrol, digunakan, diarahkan ..., tetapi tidak input!
Pertanyaan saya adalah: apakah seseorang mengerti mengapa dan bagaimana jalur (5) berfungsi ???
... "<& 0" adalah kependekan dari "0 <& 0", mengapa pengalihan 0 ke 0 adalah solusi, dan apa yang sebenarnya terjadi di belakang dengan input proses terpisah. Subshell bukan masalah, menggunakan kawat gigi {...} alih-alih (...) memberikan hasil yang sama.
... dan pertanyaan2: apakah ada solusi yang lebih baik untuk "memberikan input ke proses terpisah" daripada baris (6).
sumber
bash
menafsirkannya (dan itu terdengar seperti interpretasi yang masuk akal) sebagai membatalkan/dev/null
pengalihan. Sekarang, tidak banyak cangkang yang melakukan hal yang sama. Abu dan pdksh tidak.3<&-
bagian itu diperlukan dan apakah aman untuk menggunakannya (tidak akan menutup pipa sebelum input penuh dibaca)?cmd
tidak membutuhkannya. Kami menutupnya setelah kami menimpanya ke fd 0 (<&3
kependekan dari0<&3
).nohup
juga pengalihan stdin ke / dev / null, sehingga Anda akan perlu:{ nohup sh -c 'cmd <&3 3<&-' & } 3<&0
. Atau(trap '' HUP; cmd <&3 3<&- > nohup.out 2>&1 &) 3<&0