Chciałbym przesyłać standardowe wyjście programu zachowując je na ekranie.
Z prostym przykładem ( echo
użyj tutaj tylko w celach ilustracyjnych):
$ echo 'ee' | foo
ee
<- wyjście, które chciałbym zobaczyć
Wiem, że tee może skopiować standardowe wyjście do pliku, ale nie tego chcę.
$ echo 'ee' | tee output.txt | foo
Próbowałem,
$ echo 'ee' | tee /dev/stdout | foo
ale to nie działa, ponieważ wyjście tee /dev/stdout
jest przesyłane dofoo
echo 'ee' | tee /dev/stderr
działa, więc jeśli stderr spełnia również twoje wymagania „na ekranie” , to zrobi to.Odpowiedzi:
Oto rozwiązanie, które działa na dowolnej implementacji Unix / Linux, zakładając, że zależy mu na przestrzeganiu
POSIX
standardu. Działa w niektórych środowiskach innych niż Unixcygwin
.Odniesienie: specyfikacja podstawowa dla otwartej grupy, wydanie 7 IEEE Std 1003.1, wydanie 2013, §10.1 :
Zgłoszono, że niektóre środowiska, takie jak Google Colab, nie wdrażają się,
/dev/tty
a ichtty
polecenia zwracają użyteczne urządzenie. Oto obejście:lub ze starożytną skorupą Bourne'a:
źródło
/dev/tty
jest obowiązkowym urządzeniem uniksowym. Czy pracujesz w więzieniu BSD?tee
następujący sposób:cat some.log | tee /dev/tty | tee -a other.log | grep -i 'foo' >> foo.log
do 1) przenieś wszystko do konsoli, 2) dodaj wszystko do innego pliku, 3) pobierzfoo
linie do innego pliku./dev/tty
, ale wyniktty
jest użyteczny.Kolejną rzeczą do wypróbowania jest:
Jest
>(foo)
to podstawienie procesu .źródło
foo
będzie musiało być częścią podstawienia procesu. Oto przykład:echo 'ee' | tee file.txt >(wc -c | tr -d ' ')
echo 'ee' | tee >(cat) | foo | bar
.Dostęp do „/ dev / stdout” jest zabroniony w niektórych systemach, ale dostęp do terminala użytkownika zapewnia „/ dev / tty”. Używając „wc” dla „foo”, powyższe przykłady działają OK (na Linux, OSX itp.) Jako:
Aby dodać liczbę na dole listy pasujących plików, używam czegoś takiego:
% ls [A-J]* | tee /dev/tty | wc -l
Aby uniknąć konieczności zapamiętywania tego wszystkiego, definiuję aliasy:
% alias t tee /dev/tty
% alias wcl wc -l
żebym mógł po prostu powiedzieć:
% ls [A-J]* | t | wcl
źródło
Próbować:
Oczywiście użycie stderr jest opcją.
źródło
najpierw musisz dowiedzieć się, który terminal jest powiązany z twoim ekranem (lub którymkolwiek innym ekranem, na którym chcesz wyświetlać dane wyjściowe):
następnie możesz przełączyć wyjście do tego terminala i przesłać drugą kopię przez program foo:
źródło
t
jest bezużyteczne. Możesz użyć,echo ee | tee $(tty) | foo
ale nadal ma bezużyteczne polecenie (tty
), ponieważ po/dev/tty
prostu działa.