Jak nazywa się funkcja powłoki `> (tee copyError.txt> & 2)`?

11

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.

dersimn
źródło
Przekierowanie pliku ( tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-3.html )
Kartik
@terdon Myślę, że OP stwierdził, że chce zalogować StdOut i StdErr do plików, ale nadal wyświetla StdErr na ekranie
Dmitry Avtonomov

Odpowiedzi:

11

Od man bash:

   Process Substitution
       Process substitution is supported  on  systems  that  support
       named  pipes  (FIFOs)  or  the  /dev/fd method of naming open
       files.  It takes the form of <(list) or >(list).  The process
       list  is  run with its input or output connected to a FIFO or
       some file in /dev/fd.  The name of this file is passed as  an
       argument  to  the current command as the result of the expan
       sion.  If the >(list) form is used, writing to the file  will
       provide  input  for  list.   If the <(list) form is used, the
       file passed as an argument should be read to obtain the  out
       put of list.

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 />\(.

Martin von Wittich
źródło
Robię dużo bashu, więc zrobiłem man bash> bashman.txt i sprawiłem, że jest tylko do odczytu. Teraz mogę załadować bashman.txt do innego okna w moim edytorze tekstu (tylko do odczytu) i korzystać ze wszystkich funkcji edytora do wyszukiwania, kopiowania i wklejania.
Joe
8

>(tee copyError.txt >&2) to w rzeczywistości kilka różnych funkcji:

  • >(...)nazywa się „substytucją procesu”. Tworzy nazwany plik potoku , /dev/fda 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 ( >lub 1>) lub standardowy błąd ( 2>) do pliku lub procesu. >&2Wyjście jest przekierowanie, ale w tym przypadku, sygnał wyjściowy teejest wysyłany do błędu standardowego (to co &2jest, &1to 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:

    $ foo='Tom';(foo='Dick'; echo "Sub: $foo"); echo "Orig: $foo"
    Sub: Dick
    Orig: Tom

    Jak widać, to, $fooco zostało zdefiniowane w podpowłoce jest inne niż zdefiniowane w powłoce nadrzędnej.

terdon
źródło
4
Nie, >(...)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.
Stéphane Chazelas,
@StephaneChazelas Byłoby miło zobaczyć rozwiązanie, o którym pomyślałeś
Dmitry Avtonomov
3
@chhh,cmd 2>&1 > output | tee err >&2
Stéphane Chazelas,
@StephaneChazelas thx!
Dmitry Avtonomov
Pierwsza połowa tej odpowiedzi jest błędna lub przynajmniej bardzo myląca; to prawda, że >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 ().
ruakh