jeśli chcę wyświetlić „aaa” na ekranie:
(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
wniosek z (3) i (4) -> odłączony proces nadal ma podłączone wyjście, które można kontrolować, wykorzystywać, przekierowywać ..., ale nie wprowadzać!
Moje pytanie brzmi: czy ktoś rozumie, dlaczego i jak działa linia (5) ???
... „<& 0” to skrót od „0 <& 0”, dlaczego przekierowanie 0 na 0 jest rozwiązaniem i co tak naprawdę dzieje się z wejściem odłączonego procesu. Podkładki nie stanowią problemu, używanie nawiasów klamrowych {...} zamiast (...) zapewnia takie same wyniki.
... i pytanie 2: czy istnieje lepsze rozwiązanie dla „przekazywania danych wejściowych procesowi odłączonemu” niż linia (6).
źródło
bash
interpretuje to (i to brzmi jak rozsądna interpretacja) jako anulowanie/dev/null
przekierowania. Teraz niewiele pocisków robi to samo. Ash i pdksh nie.3<&-
część jest potrzebna i czy można z niej bezpiecznie korzystać (czy nie zamknie rury przed pełnym wejściem odczytanym)?cmd
nie jest to potrzebne. Zamykamy go po skopiowaniu go na fd 0 (<&3
skrót od0<&3
).nohup
przekierowuje również stdin do / dev / null, więc należałoby:{ nohup sh -c 'cmd <&3 3<&-' & } 3<&0
. Lub(trap '' HUP; cmd <&3 3<&- > nohup.out 2>&1 &) 3<&0