Muszę zalogować stdout i stderr do plików dziennika, ale wyświetlam tylko komunikaty o błędach na ekranie. Mogę to zrobić za pomocą:
cp -rpv a/* b 1> copyLog.txt 2> >(tee copyError.txt >&2)
Który znalazłem gdzieś w sieci.
Chcę tylko wiedzieć, jak to >(tee copyError.txt >&2)
się nazywa? Nie mogę go znaleźć w Google, ponieważ Google ignoruje takie znaki, jak nawiasy kątowe i nawiasy.
Odpowiedzi:
Od
man bash
:Możesz przeszukiwać strony, naciskając,
/
a następnie wpisując szukany ciąg, co jest dobrym sposobem na znalezienie takich informacji. To oczywiście wymaga, abyś wiedział, na której stronie szukać :)Musisz jednak podać ten cytat
(
, ponieważ ma on specjalne znaczenie podczas wyszukiwania. Aby znaleźć odpowiednią sekcję na stronie podręcznika bash, wpisz/>\(
.źródło
>(tee copyError.txt >&2)
to w rzeczywistości kilka różnych funkcji:>(...)
nazywa się „substytucją procesu”. Tworzy nazwany plik potoku ,/dev/fd
a zapis do tego pliku zapewni dane wejściowe do procesu w nawiasach.>
: Zasadniczo jest to nazywane „przekierowaniem wyjścia” i pozwala wysłać standardowe wyjście (>
lub1>
) lub standardowy błąd (2>
) do pliku lub procesu.>&2
Wyjście jest przekierowanie, ale w tym przypadku, sygnał wyjściowytee
jest wysyłany do błędu standardowego (to co&2
jest,&1
to standardowe wyjście)Bez tego
>
nawiasy (()
) uruchomią podpowłokę. Uruchamianie poleceń w nawiasach spowoduje odrodzenie kolejnej powłoki, która będzie istnieć tylko przez czas działania tych poleceń. Możesz zobaczyć, jak to działa, jeśli zadeklarujesz zmienną w podpowłoce:Jak widać, to,
$foo
co zostało zdefiniowane w podpowłoce jest inne niż zdefiniowane w powłoce nadrzędnej.źródło
>(...)
to nie jest przekierowanie.>(...)
jest rozwinięty do nazwy pliku. Jeśli chcesz przekierować dane wyjściowe do tego, potrzebujesz,> >(...)
ale>(...)
bardziej ogólnie, gdy przekierowań nie można użyć. Komendę OP można wykonać tradycyjnymi rurami, nie ma potrzeby zastępowania procesu.cmd 2>&1 > output | tee err >&2
>
może oznaczać przekierowanie wyjścia i()
może oznaczać podpowłokę, ale w>(...)
rzeczywistości jest pojedynczą, jednolitą funkcją, która nie składa się z>
i()
.