2009-02-20 4 views

Odpowiedz

41
echo "hey hey, we're the monkees" | tee /dev/tty | gzip --stdout > my_log.gz 

Jak zauważył w komentarzach, /dev/stdout potęga w pewnych okolicznościach działają lepiej niż /dev/tty.

+0

_A_w_e_s_o_m_e_. Dziękuję Ci. –

+3

Co tam robi/dev/tty? Pierwotne pytanie dotyczyło wyjścia na standardowe wyjście, niekoniecznie na terminalu. –

+4

/dev/tty to synonim bieżącego terminalu. Pytający użył "standardowego wyjścia" w zwyczajowy sposób, aby określić obecny terminal, zamiast bardziej ścisłej definicji tego terminu. –

16

Miłej filiżanki z tee!

kopiuje standardowe wejście polecenia tee na standardowe wyjście, a także do wszelkich plików podanych jako argumenty. To przydatne, gdy chcemy nie tylko wysłać niektóre dane w dół rury, ale również do zapisać kopię

Jak mam powolne popołudnie, oto niektóre świetnie ilustrujące ASCII-art ...

  +-----+     +---+     +-----+ 
stdin -> |cmd 1| -> stdout -> |tee| -> stdout -> |cmd 2| 
      +-----+     +---+     +-----+ 
             | 
             v 
            file 

Jak greyfade demonstruje w innym odpowiedź na „plik” nie musi być zwykłym plikiem, ale może być FIFO pozwalając Ci rurę że tee'd wyjście do trzeciego polecenia.

  +-----+     +---+     +-----+ 
stdin -> |cmd 1| -> stdout -> |tee| -> stdout -> |cmd 2| 
      +-----+     +---+     +-----+ 
             | 
             v 
            FIFO 
             | 
             v 
            +-----+ 
            |cmd 3| 
            +-----+ 
+0

Ale chcę gzip pliku pośrednika w locie.Czy to możliwe tylko przy użyciu tee? –

+0

tak, inny Paul napisał ładny zwięzły odpowiadam, gdy mówiłem o schemacie ASCII :) –

+1

Ale +1 za doskonałe wyjaśnienie. –

46

Kolejny sposób (zakładając skorupę jak bash lub zsh):

echo "hey hey, we're the monkees" | tee >(gzip --stdout > my_log.gz) 

wprawdzie dziwny >() składnia zasadzie sposób następujący:

  • Utwórz FIFO (zazwyczaj coś w /tmp/)
  • Wykonaj polecenie wewnątrz () ib ind FIFO do stdin na tej podkomisji
  • Zwraca nazwę FIFO do wiersza poleceń.

Co tee kończy się widząc, więc jest coś takiego:

tee /tmp/arjhaiX4 

Wszystko gzip widzi to jego standardowe wejście.

Aby uzyskać szczegółowe informacje, przejdź do sekcji Bash, patrz: man bash. Jest w sekcji na redirection. W przypadku Zsh patrz man zshexpn w tytule "Zastąpienie procesu".

O ile mogę powiedzieć, Powłoka Korn, warianty klasycznej powłoki Bourne'a (w tym popiołu i myślnika) i C Shell nie obsługują tej składni.

+0

Fajnie, sam się czegoś uczę. Czy możesz wyjaśnić, co się tam dzieje? –

+0

Będę edytować mój wpis. – greyfade

+0

Jeśli przeczytałem to dobrze, zamiast podać plik do tee, masz go wysyłając kopię jako dane wejściowe do wyrażenia w nawiasach kwadratowych, które zapisuje dane wyjściowe gzip do innego pliku. Nieskompresowane dane pozostawiają tee jak zwykle na stdout –

6

Wystarczy odpowiedzieć w sposób, który nie powoduje konieczności dotykania dysk:

echo "hey hey, we're the monkees" | (exec 1>&3 && tee /proc/self/fd/3 | gzip --stdout > my_log.gz) 
+0

Co, masz na myśli/tmp jest na dysku?!?!?!? – SamB

+0

Z punktu widzenia bezpieczeństwa jest. – Joshua