Widziałem to na górze mojego pliku skryptu bash:
export LOGFILE=$LOGDIRECTORY/${SCRIPT_NAME}.log
exec > >(tee $LOGFILE)
exec 2>&1
Co to robi? Co tutaj robią dwa procesy exec? Zdaję sobie sprawę z tego, że tak to jest, wszystkie wyniki wykonania skryptu są przesyłane strumieniowo, $LOGFILE
ale chciałem zrozumieć z perspektywy exec
instrukcji.
exec
linie mogłyby idealnie być tylko jedną (exec > >(tee "$LOGFILE") 2>&1
).Odpowiedzi:
W powłokach
exec
robi 1) otwieranie i przekierowywanie plików 2) faktyczneexec
ing (zastępowanie bieżącego obrazu procesu innym obrazem procesu).Są
exec
to przekierowania.Najpierw przekierowania (
exec 1> >(tee $LOGFILE)
) zstdout
deskryptora (1) do procesu substytucji generowane rury podłączonej do jednoczesnego uruchomieniatee
procesu, który ma$LOGFILE
jako pierwszy argument i przekierowaćstderr
deskryptora (2) w tym samym miejscu, gdzie deskryptora1
teraz punktów (tee rura).Pamiętając o tym, że deskryptory plików są dziedziczone, cała przyszłość
stdout
istderr
dane wyjściowe trafiają dotee
procesu, który zapisuje je$LOGFILE
w dowolnym miejscu, gdzie pierwotnie wskazywał skrypt filedescriptor (prawdopodobnie twój terminal).Uwaga: Wyjścia procesowe tee do oryginalnego stdout (= oryginalny deskryptora 1), ponieważ, jak można dowiedzieć się z / poszukiwania bash (1) dla prostych rozszerzeń poleceń i Zmiana Process , substytucyjnego proces (
>()
<()
) dzieje się (wraz z innymi rozszerzeniami) przed przekierowania zostaną wykonane, co oznacza, że przekierowanieexec 1> >(tee "$LOGFILE")
nastąpi potee
rozpoczęciu, pozostawiająctee
z tym samym skryptem plików 1, który odziedziczył z powłoki nadrzędnej. (Gdyby było na odwrót,tee
zapisano by na podstawie własnych danych wejściowych, co może spowodować impas, w zależności od wzorca IO).źródło