se eu quiser exibir "aaa" na tela:
(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
A confusão de (3) e (4) -> processo desanexado ainda tem saída conectada que pode ser controlada, usada, redirecionada ..., mas não é entrada!
Minha pergunta é: alguém entende por que e como a linha (5) funciona ???
... "<& 0" é a abreviação de "0 <& 0", por que redirecionar 0 a 0 é solução e o que realmente acontece por trás da entrada do processo desanexado. O subshell não é o problema, usar chaves {...} em vez de (...) fornece os mesmos resultados.
... e question2: existe melhor solução para "dar entrada ao processo desanexado" do que a linha (6).
fonte
bash
interpreta (e isso soa como uma interpretação razoável) como cancelamento do/dev/null
redirecionamento. Agora, poucas conchas fazem o mesmo. Ash e pdksh não.3<&-
peça é necessária e é seguro usá-la (não fechará o tubo antes da leitura completa da entrada)?cmd
não é necessário. Nós o fechamos depois de colocá-lo em fd 0 (<&3
abreviação de0<&3
).nohup
também redireciona stdin para / dev / null, então você precisa:{ nohup sh -c 'cmd <&3 3<&-' & } 3<&0
. Ou(trap '' HUP; cmd <&3 3<&- > nohup.out 2>&1 &) 3<&0