exec i tee do pliku dziennika: wyjaśnij te polecenia bash

15

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, $LOGFILEale chciałem zrozumieć z perspektywy execinstrukcji.

Senthil Kumaran
źródło
1
Widziałeś to na górze Twojego pliku skryptu bash? ;)
Sebb
1
Dwie execlinie mogłyby idealnie być tylko jedną ( exec > >(tee "$LOGFILE") 2>&1).
Jonathan Leffler,

Odpowiedzi:

18

W powłokach execrobi 1) otwieranie i przekierowywanie plików 2) faktyczne execing (zastępowanie bieżącego obrazu procesu innym obrazem procesu).

execto przekierowania.

Najpierw przekierowania ( exec 1> >(tee $LOGFILE)) z stdoutdeskryptora (1) do procesu substytucji generowane rury podłączonej do jednoczesnego uruchomienia teeprocesu, który ma $LOGFILEjako pierwszy argument i przekierować stderrdeskryptora (2) w tym samym miejscu, gdzie deskryptora 1teraz punktów (tee rura).

Pamiętając o tym, że deskryptory plików są dziedziczone, cała przyszłość stdouti stderrdane wyjściowe trafiają do teeprocesu, który zapisuje je $LOGFILEw 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 ​​przekierowanie exec 1> >(tee "$LOGFILE")nastąpi po tee rozpoczęciu, pozostawiając teez tym samym skryptem plików 1, który odziedziczył z powłoki nadrzędnej. (Gdyby było na odwrót, teezapisano by na podstawie własnych danych wejściowych, co może spowodować impas, w zależności od wzorca IO).

PSkocik
źródło