Znaczenie „2>> (polecenie)” Przekierowanie w Bash


18

Jakiś czas temu stworzyłem skrypt i dodałem trochę logowania, ale zapomniałem, jak działa przekierowanie do logowania :-(

Jego istotą jest:

#!/bin/bash

LOGFILE=/some/path/mylogfile

(
  # here go my commands which produce some stdout
  # and, if something goes wrong, also some stderr
) 1>>${LOGFILE} 2> >( tee -a ${LOGFILE} >&2 )

Po uruchomieniu skryptu nic nie drukuje stdout, ale drukuje tylko to, co się dzieje stderr. Plik dziennika ${LOGFILE}przechwytuje zarówno stdout, jak i stderr.

Kiedy uruchamiam skrypt i na terminalu nie ma danych wyjściowych, wiem, że wszystko jest w porządku. Jeśli jest jakiś wynik, wiem, że coś poszło nie tak i mogę sprawdzić plik dziennika, aby dowiedzieć się, na czym polega problem.

Część przekierowania, która mnie teraz zastanawia, to składnia: 2> >( some command )

Czy ktoś może wyjaśnić, co się tam dzieje?

Odpowiedzi:


23

>(...)nazywa się substytucją procesu . Pozwala programowi „zewnętrznemu” pisać do programu „wewnętrznego” tak, jakby był plikiem.

W tym przypadku jest to zapis, stderrdo tee -a ${LOGFILE} >&2którego dopisuje się, LOGFILEa następnie zapisuje wszystko z powrotem stderr.

Operator przekierowania może iść w dowolnym kierunku w celu podstawienia procesu, więc możesz do niego pisać, jak w tym przykładzie, lub użyć go <(...)do odczytu, co jest przydatnym sposobem na przykład wykonanie whilepętli bez uruchamiania go w podpowłoce samo.


5
Got it :-) Gdybym wykonać echo <(date), to daje mi nazwę podstawionego pliku: /dev/fd/63. Jeśli mogę wykonać cat <(date), to daje mi datę, czyli zawartość podstawionym pliku: Fri Nov 18 14:11:09 NZDT 2016.
NZD

@NZD, tak - ale nie wyobrażaj sobie, że jest to zwykły plik - to, co widzisz, /devto nazwa potoku między procesami.
Toby Speight,

Czy zastosowano tę technikę, ponieważ stderr nie może być potokowany ( teew tym przypadku)?
bli

@bli Tak, ponieważ stdout jest już przekierowywany gdzie indziej, wydaje mi się to najprostszym sposobem na teestderr i oddzielenie go od stdout.
Eric Renouf,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.