если я хочу отобразить «ааа» на экране:
(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
Выводы из (3) и (4) -> отдельного процесса все еще имеют подключенный выход, которым можно управлять, использовать, перенаправлять ..., но не вводить!
У меня вопрос: кто-то понимает, почему и как работает line (5) ???
... «<& 0» - это сокращение от «0 <& 0», почему перенаправление от 0 до 0 является решением, и что на самом деле происходит после ввода отдельного процесса. Subshell не являются проблемой, использование фигурных скобок {...} вместо (...) дает те же результаты.
... и вопрос2: есть ли лучшее решение для "ввода данных в отдельный процесс", чем строка (6).
источник
bash
оно (и это звучит как разумная интерпретация) отменяет/dev/null
перенаправление. Сейчас не многие снаряды делают то же самое. Эш и ПДКШ нет.3<&-
нужна эта деталь, и безопасно ли ее использовать (не закроет ли канал, пока не будет прочитан полный ввод)?cmd
это не нужно. Мы закрываем его после того, как опустили его на fd 0 (<&3
сокращение от0<&3
).nohup
также перенаправляет STDIN в / DEV / нуль, так что вам нужно:{ nohup sh -c 'cmd <&3 3<&-' & } 3<&0
. Или(trap '' HUP; cmd <&3 3<&- > nohup.out 2>&1 &) 3<&0